c – 我可以将__cdecl导出调用与DLL中的__stdcall导入调用混合使用吗?
作者:互联网
我正在为第三方应用程序编写模块;该应用程序使用__cdecl调用约定.
与此同时,我有一个使用__stdcall调用约定的遗留DLL.
我可以创建一个包装器,在一端导出__cdecl函数,而在另一端导入__stdcall函数?我还有哪些其他选择?
谢谢,
编辑:
这是一些额外的信息,我的帮助澄清了我的情况.
有一个third_party.exe需要访问skeleton.dll.源代码skeleton.dll包含下面的头文件,并使用__cdecl进行编译.
#ifdef _EXPORTING
#define DECLSPEC __declspec(dllexport)
#else
#define DECLSPEC __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
DECLSPEC int ICD_Create(char* id);
...
...
...
理想情况下,我会使用骨架源代码来开发我的DLL;遗憾的是,将当前的VB6遗留代码移植到C中会花费太多时间.鉴于此,我不得不通过遵循this guideline来破解我的VB6代码(这是一个解决方法,但它允许我使用ActiveX DLL作为标准C DLL).
我对修改后的VB6调用约定没有百分之百的信心,也不知道如何修改它.练习使用__stdcall,似乎与我开发的测试应用程序一起正常工作.但是,当我使用第三方应用程序测试它时,它会正确调用某些函数,但在其他函数中它会崩溃.
架构看起来像:
Application: ThirdParty.exe (out of your control: Uses __cdecl)
|
|
Plugin module: Skeleton.dll (your code)
|
|
Legacy DLL: ModifiedVB6.dll (out of your control: Seem to work with __stdcall)
旧版DLL生成一个dll,lib和def文件;没有头文件.
解决方法:
DLL通常会带有一个头文件(.h)和一个关联的导入库(.lib),它们处理调用约定,导出的函数原型等.
只需包含头文件,链接到导入库,您就可以直接调用这些函数.
该头文件将指定函数使用__stdcall调用约定.你肯定不会,也不应该写一个单独的包装DLL.这将增加一个完全无偿的复杂层.
重新阅读您的问题和评论后,我相信您拥有以下架构:
Application (out of your control)
|
|
Plugin module (your code)
|
|
Legacy DLL (out of your control)
旧版DLL使用__stdcall导出其函数.应用程序使用__cdecl从插件导入函数.
如果该概要正确,那么您当然必须使用__stdcall从旧DLL导入并使用__cdecl导出到应用程序.由于界面的这些部分超出了您的控制范围,因此您无法选择.
但是,我发现问题和评论很难遵循.也许我还没有完全理解.您可以随意添加更多信息,以便在编辑问题时进行澄清.
在更新之后,我怀疑你的问题都与如何将VB6遗留DLL与C DLL接口有关.由于您没有VB6 DLL的头文件(.h),因此您可能正在编写自己的翻译.
如果我没记错的话,VB6只支持你正在使用的__stdcall.因此,您的问题很可能是由于导出的VB函数错误地转换为C原型.
我认为您最好的行动方案是专注于使这些原型翻译正确.也许您可以考虑在单独的独立测试项目的上下文中执行此操作,以避免整个应用程序的复杂性.
如果您需要Stack Overflow的进一步帮助,我认为您需要提供VB6函数声明和您尝试过的翻译,但我认为这将是新问题的主题.
标签:c-3,c,calling-convention 来源: https://codeday.me/bug/20190826/1734358.html