繁体   English   中英

如何在托管代码中使用c ++ dll中的其他dll创建方法?

[英]How do you make a method avaible to other dlls in a c++ dll in managed code?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM