我正在从外部.dll 在控制台应用程序中导入一个函数,该函数从共享内存中复制一个结构(如果你想测试它,那么任何全局内存都应该工作)
这是dll中的函数
struct DataMemBuff {
double High[5] = { 0,0,0,0,0 };
};
#ifdef __cplusplus // If used by C++ code,
extern "C" { // we need to export the C interface
#endif
__declspec(dllexport) DataMemBuff __cdecl GetDatainBuf();
#ifdef __cplusplus
}
#endif
DataMemBuff __cdecl GetDatainBuf()
{
DataMemBuff tempbuf;
memcpy(&tempbuf, lpvMem, sizeof(tempbuf));
return tempbuf;
}
这是我如何将该功能导入控制台应用程序的示例
#include "stdafx.h"
#include <Windows.h>
#include <memory.h>
#include <iostream>
#include <tchar.h>
using namespace std;
typedef DataMemBuff(CALLBACK* _cdecl GetData)(void);
GetData _GetData;
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE hDll = NULL;
int x = 1;
struct DataMemBuff tempIndcData;
hDll = LoadLibrary(_T("Data.dll"));
if (hDll == NULL)
{
cout << "The dll did not load" << endl;
printf("Here is the error %lu", GetLastError());
}
else
{
cout << "The dll loaded fine" << endl;
}
_GetData = (GetData)GetProcAddress(hDll, "GetDatainBuf");
if (!_GetData)
{
// handle the error
cout << "The dll did not load the function" << endl;
}
else
{
// call the function
tempIndcData = _GetData();
printf("The memory was copied\n");
}
}
该函数可以正常导入,但是由于 c 风格的调用约定 _cdecl 将堆栈上的数据返回给函数时出现问题,并且在调用导入的函数时会在此行引发异常:
tempIndcData = _GetData();
抛出异常:这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。
我尝试在声明中加入 _cdecl :
typedef DataMemBuff(CALLBACK* GetData)(void);
GetData _GetData;
对此:
typedef DataMemBuff(CALLBACK* _cdecl GetData)(void);
GetData _cdecl _GetData;
这并没有帮助,可能是因为我对调用的理解不够,但必须有某种方法告诉 GetProcAddress 它正在使用 c 风格的调用约定进行函数调用。
我的问题是:我使用什么语法来导入使用 GetProcAddress 的 c 风格调用约定的函数?