我正在尝试将stdcall调用约定添加到我的GNU编译DLL中。
这是我的代码:
typedef void (__stdcall * CTMCashAcceptCallback) (
const struct CTMEventInfo,
const struct CTMAcceptEvent );
这个函数调用了它:
LIBCTMCLIENT_FUNC void ctm_add_cash_accept_event_handler(CTMCashAcceptCallback);
其中:
#define LIBCTMCLIENT_FUNC LIBCTMCLIENT_C_LINKAGE __declspec(dllexport) __stdcall
问题是它给了我这个说明:
注意:预期'CTMCashAcceptCallback'但参数类型为'void(*)(const struct CTMEventInfo,const struct CTMAcceptEvent)'
当我删除__stdcall或用__cdecl替换它时,它不会提供该信息。在通过GNU编译时是不可能使用stdcall,或者我做得不对?
答案 0 :(得分:1)
用户代码需要明确地告诉编译器它自己的函数(你没有显示的函数)是__stdcall
,如果这是DLL所期望的。像
__stdcall myCTMCashAccept (
const struct CTMEventInfo,
const struct CTMAcceptEvent)
{
//...
}
// ...
ctm_add_cash_accept_event_handler(myCTMCashAccept);
应该有用。
请记住,您展示的#define LIBCTMCLIENT_FUNC
是关于调用DLL的用户代码的约定;而回调,其typedef
,是另一种方式:它是调用用户代码的DLL。他们不必使用相同的约定(尽管它们更清楚);因此,如果您的用户代码可能使用__cdecl
代码(可能因为它已经存在),那么您应该从__stdcall
中移除typedef
(它也应该有效)。< / p>