Compiling a DLL in C++ mingw 64

Compiling a DLL in C++ mingw 64

本文关键字:mingw C++ in DLL Compiling      更新时间:2023-10-16

我想用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++之间发送和返回的类型大小完全相同,否则可能导致堆栈损坏。