__stdcall без каких-либо украшений - PullRequest
2 голосов
/ 26 марта 2012

У меня есть .dll Я подозреваю, что использует __stdcall функции, но полностью недекорированные имена (даже не знак подчеркивания или @). Я написал .def файл для него с псевдонимами вроде

func1 = func1
func1@4 = func1

но я думаю, lib (который я использую для создания библиотеки импорта из файла .def) игнорирует псевдонимы (компоновщик все еще говорит, что func1@4 не определен)

Как создать библиотеку импорта, которая будет сопоставлять func1@4 с func1?

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Я не знаю, возможно ли создать правильный .lib файл с lib.exe, поэтому я предлагаю создать DLL с заглушками функций, экспортируемых исходной DLL.

Пример dll.cpp файл:

void __stdcall foo(int) {}

dll.def file:

EXPORTS
foo=foo

Затем вы компилируете его из IDE или из командной строки:

cl dll.cpp /link /dll /def:dll.def /noentry

Он создаст правильный dll.lib файл, так что вы можете использовать его с таким кодом:

void __stdcall foo(int);
#pragma comment(lib, "dll")
int main()
{
    foo(42);
}
0 голосов
/ 26 марта 2012

Вы должны объявить прототип функции как extern "C", поскольку вы (очевидно) компилируете в режиме C ++:

extern "C" void func1(void); // correct prototype, add __stdcall if necessary?

Вы можете заключить целые разделы файла заголовка в

extern "C" {
    // ... C compatible declarations
}
...