如何使一个方法可用于 c++ 中的其他 dll?托管代码中的dll?

发布于 2024-12-05 23:50:04 字数 743 浏览 0 评论 0 原文

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

The first piece of code is the example i am working on, after changing it to the second example, it works exept for the __declspec(dllexport) wich gives a __declspec(dllexport) cannot be applied to a function with the __clrcall calling convention. removing that piece of code does make the dll compile but the method is unavaible to the target dll. Also when i use PE Explorer to look into the DLL there are no export methods. Is there a managed variant for the __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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清风疏影 2024-12-12 23:50:04

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

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:

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..
}

Explicitly selecting the calling convention is always a good idea. I added __stdcall for that reason, the most common one for exported DLL functions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文