如何在托管代码中为c ++ dll中的其他dll提供方法?

时间:2011-09-21 08:35:41

标签: c++ clr

第一段代码是我正在处理的示例,在将其更改为第二个示例之后,它为__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);
}

1 个答案:

答案 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函数最常见的一个。