对导入的方法强制执行 stdcall

Force stdcall for imported methods

我正在尝试 link 针对一个带有头文件的 dll。由于没有可用的 *.lib 文件,我通过手动创建一个 *.def 文件来创建一个 (Ref)

现在的问题是,我的测试程序是__cdecl,dll中的方法是__stdcall。 有没有办法在特定方法动态 linked 时强制 __stdcall

尽管这不是一个选项,但尝试将调用约定 (/Gd) 更改为 /Gz,但出现名称修改时说 linker 未能找到稍微损坏的方法如下所示。

LNK2019 unresolved external symbol _TSTInitialize@24 referenced in function

头文件中的函数签名是,

#define TSTPERC_API /*__declspec( dllimport ) __stdcall */  

TSTHandle cOpts;

    //call native methods
    TSTFunctionResult cResult = ::TSTInitialize(
        p_strPathToLib.c_str(), p_strConfigStruct.c_str(), p_strLic.c_str(),
        p_strRFU1.c_str(), p_strRFU2.c_str(), &cOpts );

好吧,你不会对 .def 不正确的方法强制执行 stdcall .lib 个文件。

本例中的@24是被调用者需要清理的栈上的字节。所以没有办法将其剥离(如果你这样做,那么被调用者就无法知道要从堆栈中清除多少字节!!)。

真正的问题出在我创建的 *.def 文件上。在我对@hans-passant 的评论中,语法是相反的,

TSTInitialize@24=TSTInitialize

这将使正确的导出符号,_TSTInitialize@24在lib文件linker中寻找。这有助于将程序还原为使用 /Gd 而不是 /Gz