Принудительный вызов stdcall для импортированных методов - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь связать с DLL, который сопровождается файлом заголовка. Поскольку доступного файла * .lib не было, я создал его вручную, создав файл * .def ( Ref )

Теперь проблема в том, что моя тестовая программа __cdecl и методы в dll __stdcall. Есть ли способ заставить __stdcall для определенных c методов, когда они динамически связаны?

Даже если это не вариант, попытался изменить соглашение о вызовах (/Gd) на /Gz, но появилось искажение имени, сказав, что компоновщику не удалось найти слегка искаженный метод, как показано ниже.

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 );

1 Ответ

0 голосов
/ 03 марта 2020

Ну, вы не заставляете stdcall для методов с неправильными .def или неправильными .lib файлами.

@24 в этом случае это байты в стеке, которые нужно очистить вызываемому объекту. Таким образом, нет никакого способа обойти его (если вы это сделаете, то у вызываемого не будет способа узнать, сколько байтов нужно очистить из стека !!).

Настоящая проблема была с файлом * .def, который я создал. Синтаксис обратный в моем комментарии к @ hans-passant,

TSTInitialize@24=TSTInitialize

Это сделает правильный символ экспорта, _TSTInitialize@24 в файле lib, который ищет linker. Это помогает вернуть программу для использования /Gd вместо /Gz

...