2012-03-26 4 views
2

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

func1 = func1 
[email protected] = func1 

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

Как создать библиотеку импорта, которая будет отображать [email protected] в func1?

+0

Синтаксис в вашем файле экспорта выглядит некорректным. Проверьте с помощью dumpbin.exe. Обычно каждая строка должна содержать только имя, которое вы хотите, чтобы функция имела (например, 'func1'), и компоновщик будет определять сами детали. –

ответ

0

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

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

Вы можете обернуть все разделы заголовка файла внутри

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

Я использую 'extern 'c" '. По своей сути он меняет его на '__cdecl'. Когда я добавляю '__stdcall', я получаю' @ '. – baruch

+0

@baruch, возможно, вы могли бы показать нам код. FWIW, я не думаю, что проблема в файле def – sehe

+0

Какой код? У меня нет источника dll. – baruch

2

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

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

void __stdcall foo(int) {} 

dll.def файл:

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

 Смежные вопросы

  • Нет связанных вопросов^_^