【问题标题】:Adding an stdcall on a callback function gives an argument mismatch [GNU]在回调函数上添加 stdcall 会导致参数不匹配 [GNU]
【发布时间】:2015-03-18 12:37:55
【问题描述】:

我正在尝试向我的 GNU 编译的 DLL 添加一个 stdcall 调用约定。

这是我的代码:

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 还是我做的不对?

【问题讨论】:

    标签: gnu stdcall


    【解决方案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 代码(可能因​​为它已经存在),那么您应该从typedef 中删除__stdcall(它也应该可以工作)。

    【讨论】:

    • 我认为CTMCashAcceptCallback没有其他代码细节,因为它是一个回调签名(函数指针)。
    • @aljochimera:我的意思是由一些“用户”提供的函数(与 DLL 的“库”相反),该类型与 CTMCashAcceptCallback 指针指向的函数兼容。很抱歉,回调(函数)和 CTMCashAcceptCallback 对象之间存在混淆,CTMCashAcceptCallback 对象是指向函数的指针。
    • 感谢@AntoineL!将 stdcall 添加到函数后,您就对了,消息不再显示。
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2018-09-28
    • 2014-04-03
    相关资源
    最近更新 更多