0

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

4

1 回答 1

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(它也应该可以工作)。

于 2015-03-18T13:06:13.333 回答