如何使一个方法可用于 c++ 中的其他 dll?托管代码中的dll?
第一段代码是我正在处理的示例,将其更改为第二个示例后,它可以工作,但 __declspec(dllexport) 除外,它给出了 __declspec(dllexport) 不能应用于具有 __clrcall 调用约定的函数。删除那段代码确实可以编译 dll,但目标 dll 无法使用该方法。另外,当我使用 PE Explorer 查看 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);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
C++/CLI 编译器支持导出托管函数。如果需要,它会自动生成一个 thunk 来加载并初始化 CLR,以便可以执行托管代码。当心开销。但是,您不能对函数参数使用任何托管类型。 IntPtr 在你的情况下。这是没有意义的,调用您的函数的非托管代码不会使用托管类型。
您必须亲自整理它们。这里不是问题,这些是指针,因此您可以简单地转换为 IntPtr:
显式选择调用约定始终是一个好主意。出于这个原因,我添加了 __stdcall,这是导出 DLL 函数最常见的一种。
The C++/CLI compiler does support exporting managed functions. It automatically generates a thunk that loads and initializes the CLR if necessary so that the managed code can be executed. Beware the overhead. You however can't use any managed types for the function arguments. IntPtr in your case. That doesn't make sense, the unmanaged code that calls your function won't be using managed types.
You'll have to marshal them yourself. Not a problem here, these are pointers so you can simply cast to IntPtr:
Explicitly selecting the calling convention is always a good idea. I added __stdcall for that reason, the most common one for exported DLL functions.