gpt4 book ai didi

c++ - 使用 extern c 和 dllexport 与模块定义 (msvc++) 进行标准调用名称修改

转载 作者:IT老高 更新时间:2023-10-28 22:25:57 34 4
gpt4 key购买 nike

我试图为 dll 导出一个简单的测试函数,以便与指定调用约定为的应用程序(仅供引用:mIRC)一起使用:

int __stdcall test_func(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)

现在,要从应用程序中调用它,我会使用 test_func,但我注意到由于名称修改,它并不像我想象的那么简单。

通过此处的类似主题,我了解到将 extern "C"__declspec(dllexport) 结合使用是一种等效的(某种程度上)消除重整的方法到模块定义(.def)。但是,当使用 extern/dllexport 方法时,我的函数(例如)总是 _test_func@numbers 而 .def 删除了所有需要与我需要导出到的应用程序一起使用的修饰。 p>

有人能解释一下这是为什么吗?我只是对这两种方法感到好奇。谢谢!

最佳答案

extern "C" 与 stdcall 无关:它仅声明禁用 C++ 名称修改(又称类型安全链接;在符号名称中包含类型信息)。无论您使用 C 调用约定还是 stdcall 调用约定,您都需要使用它。

在 stdcall 调用约定中,被调用者从堆栈中删除参数。为了安全起见,导出的名称包含被调用者将从堆栈中删除的字节数。

如果您要导出到的应用程序要求在名称中不添加 @number 后缀,这可能意味着它需要 C 调用约定。所以你应该停止将函数声明为 __stdcall。当您将其声明为 declspec(dllexport) 时,您应该在 DLL 中获得一个未修饰的名称。

在DEF文件中,你可以随意调用函数;没有执行额外的检查。

关于c++ - 使用 extern c 和 dllexport 与模块定义 (msvc++) 进行标准调用名称修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4550294/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com