c++ 带有.h文件的外部dll函数不给出返回值,但给出错误,(DLL和函数在VBA中确实工作得很好)

tp5buhyn  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(106)

返回整数(无参数)的外部DLL函数给出编译器错误:
无法在赋值中将“int*”转换为“int(*)()”
我希望返回一个int值(在VBA中可以,但在C++中不行)。
.h文件中:

extern "C" {
  __declspec(dllimport) int __stdcall WieOpenDev(void);
}

main.cpp中的代码:

int (*fcnPtrGetDev)();
fcnPtrGetDev = WieOpenDev;
std::cout << fcnPtrGetDev << '\n';

编译时给出错误:
无法在赋值中将“int*”转换为“int(*)()”
我尝试在VBA中使用此DLL函数。它确实工作得很好,返回值是6,这是正确的。
但是C++给出了这个错误。
我也试过:

int GetDev;
GetDev = WieOpenDev;

这在编译时会给出一个不同的错误:
从“int(*)()”到“int”的转换无效[-fpermissive]

bpsygsoo

bpsygsoo1#

对于x64目标,代码应该可以正常工作,但对于Win32目标,__stdcall实际上会产生不同。对于这两个目标,应编译以下代码:

int (__stdcall* fcnPtrGetDev)();
fcnPtrGetDev = WieOpenDev;
std::cout << fcnPtrGetDev;

参见Godbolt演示。
注意:要实际调用函数指针所指向的函数,需要使用

std::cout << fcnPtrGetDev();

而不是

std::cout << fcnPtrGetDev;

后者会导致打印指针值,而不是调用函数的结果。

相关问题