我有一个简单的DLL:
dllmain.cpp:
#define MYDLLDIR
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
...
}
void callByPtr(int *i) {
(*i)++;
}
chh#include "framework.h"
#ifdef MYDLLDIR
#define DLLDIR __declspec(dllexport) __stdcall
#else
#define DLLDIR __declspec(dllimport)
#endif
extern "C" {
DLLDIR void callByPtr(int *i);
};
客户:typedef void(__stdcall* callByPtr)(int*);
int main()
{
HINSTANCE hDLL;
hDLL = LoadLibrary(_T("MyDll.dll"));
if (NULL != hDLL)
{
callByPtr myCall = (callByPtr)GetProcAddress(hDLL, "callByPtr");
if (!myCall) {
return EXIT_FAILURE;
}
int i = 10;
int* ptri = &i;
std::cout << "i " << i << std::endl;
std::cout << "ptri " << ptri << std::endl;
myCall(ptri);
std::cout << "---- After Call ----\n";
std::cout << "i " << i << std::endl;
std::cout << "ptri " << ptri << std::endl;
}
}
结果:----通话前----
我= 10
ptri = 0025FB40
----通话后----
我= 11286192
ptri = 0025FB3C
ptri的地址已更改,值不是11。
如何正确实现这一点,以便我可以使用上述方法从DLL中获取值?
谢谢!
最佳答案
您的导出定义也不正确。应该是这样的:
#ifdef MYDLL_EXPORT
#define MYDLLDIR __declspec(dllexport)
#else
#define MYDLLDIR __declspec(dllimport)
#endif
并为导出(dll,定义了#MYDLL_EXPORT)和导入(客户端, undefined #MYDLL_EXPORT)使用相同的宏(MYDLLDIR)在这种情况下,您必须在所有地方对callByPtr使用相同的调用约定
__stdcall(默认值是__cstdcall)。
然后在您的pch.h中:
MYDLLDIR void __stdcall callByPtr(int *i);
关于c++ - 如何在C++中使用函数的参数作为指针从DLL返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63951075/