第一段代码是我正在处理的示例,在将其更改为第二个示例之后,它为__declspec(dllexport)工作,它给出__declspec(dllexport)不能应用于__clrcall调用的函数惯例。删除那段代码会使dll编译,但该方法对目标dll是不可用的。此外,当我使用PE资源管理器查看DLL时,没有导出方法。是否存在__declspec(dllexport)的托管变体?
extern "C" __declspec(dllexport) int UserInstruction (HWND hWnd,
HINSTANCE hInst,
double FAR *Function,
char FAR *Str1,
char FAR *Str2)
{
strcpy(Str1, "TEST FUNCTION");
return (TRUE);
}
extern "C" __declspec(dllexport) int UserInstruction (IntPtr hWnd, IntPtr hInst, double *Function, char *Str1, char *Str2)
{
Str1 = "TEST FUNCTION";
return (true);
}
答案 0 :(得分:4)
C ++ / CLI编译器支持导出托管函数。它会自动生成一个thunk,在必要时加载并初始化CLR,以便可以执行托管代码。小心开销。但是,您不能将任何托管类型用于函数参数。在你的情况下IntPtr。这没有意义,调用您的函数的非托管代码将不使用托管类型。
你必须自己组织他们。这里不是问题,这些是指针,所以你可以简单地转换为IntPtr:
extern "C" __declspec(dllexport)
int __stdcall UserInstruction (HWND hWnd, HINSTANCE hInst, double FAR *Function, char FAR *Str1, char FAR *Str2)
{
IntPtr windowPtr = (IntPtr)hWnd;
IntPtr instancePtr = (IntPtr)hInst;
// etc..
}
明确选择调用约定总是一个好主意。因为这个原因,我添加了__stdcall,这是导出的DLL函数最常见的一个。