Compiling a DLL in C++ mingw 64
Compiling a DLL in C++ mingw 64
我想用C++编译一个DLL,然后从VBA调用库。我已经在windows32位上完成了此操作。但我想复制这样的练习,因为我在工作中使用Windows 64位。考虑到这个事实,我下载了mingw 64。
我的例子:
main.h
#ifndef __MAIN_H__
#define __MAIN_H__
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
extern "C"
{
int DLL_EXPORT __stdcall add2(int num);
int DLL_EXPORT __stdcall mult(int num1, int num2);
}
#endif // __MAIN_H__
main.cpp
#include "main.h"
int DLL_EXPORT __stdcall add2(int num)
{
return num + 2;
}
int DLL_EXPORT __stdcall mult(int num1, int num2)
{
int product;
product = num1 * num2;
return product;
}
当我编译dll时,我会传递以下链接器选项:
Wl,--add-stdcall-alias
和/或
Wl,--kill-at
我还生成了.def文件,它看起来像这样:
EXPORTS
add2 @1
mult @2
我期待着一个.def文件,它看起来像这样(在我的32位电脑中):
EXPORTS
add2 @1
mult @2
add2 = add2 @1
mult = mult @2
然后我调用dll和VBA中的函数,如下所示:
Public Declare PtrSafe Function add2 _
Lib "C:MyPathdll.dll" _
(ByVal num As Long) As Long
问题是:这些函数可以从VBA编辑器中调用,并给出正确的结果,但当从Excel工作表中调用时,它们会抛出一些其他数字(传递参数的地址??)。如果在Excel内部尝试后尝试从VBA调用函数,则VBA会抛出错误(堆栈外空间)。
当我使用mingw4.7 32位时,这个问题不存在。问题是当我使用mingw4.6.3 64位编译时(我安装了mingw4.764位,但我在网上发现人们说4.6.3更稳定)
我还注意到,即使我没有传递链接器选项,.def文件看起来也与上面的文件相同。
有人能帮忙吗?发生了什么事?mingw64还是vba/Excel在作假?还是我的mingw64配置?
更新。。。。好的,我找到了这个网站:https://sites.google.com/site/jrlhost/links/excelcdll#array正如在VBA中使用和itermimediate函数所解释的那样,我的函数add2 Works来自工作表。
Public function fromWorksheetAdd2 ( dim x as Long) as Long
fromWorksheetAdd2 = add2(x)
end function
然后我可以在工作表中使用fromWorksheetAdd2,在VBA中使用Add2。然而,这种方法有点乏味。希望有人能以优雅的方式提供帮助。
查看您的参数。
VBA中的Long是64位(8字节)。在C++方面,int的大小是(int)的大小,在您使用的环境中,它很可能是4个字节。
必须保证在VBA和C++之间发送和返回的类型大小完全相同,否则可能导致堆栈损坏。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何将C++中的库和头与MinGW一起使用
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 无法在windows上使用mingw将sqlite3与c连接
- MinGw 无法从 cmake 编译测试文件
- MSYS2 MinGW程序包中缺少grpc_cpp_plugin协议
- Mingw-64 在构建和安装后不会编译 openCV 代码
- 安装MinGW后C++编译器不起作用?
- 当我尝试通过 mingw 使用 CMake 和 SFML 库编译项目时出错
- 如何在 Linux for Windows 上通过 MinGW 构建静态 ICU 的 Boost
- 使用 MinGW 在 Windows 上安装 GMP 时出错
- VSCode - C++ - MinGW 编译器的问题
- C++:如何在Windows 10上使用编译器MinGW 9.2.0安装OpenCV
- MINGW - 正确运行函数所需的 cdecl
- 尝试在Windows上执行C++时出错(通过MinGW编译)
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- SFML 库 - 在 MinGW 构建期间未找到错误
- 使用 MinGW 在 Windows 上构建 GLEW 时遇到问题
- 如何使用命令提示符、记事本和 MinGW 使用主文件、头文件和实现文件编译C++程序?
- 如何构建一个 setup.py 来编译C++使用 Python、pybind11 和 Mingw-w64 的扩展?