在回调函数上添加stdcall会导致参数不匹配[GNU]

时间:2015-03-18 12:37:55

标签: gnu stdcall

我正在尝试将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,或者我做得不对?

1 个答案:

答案 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>