Следуя моему предыдущему вопросу об отладке собственного кода, я решил создать простой тест из консольное приложение, так как я ничего не мог поделать с отладкой сервиса напрямую.
Итак, я создал консольное приложение vc6, добавил проект dll в рабочую область и запустил его.
Вместо ожидаемого выполнения он выдал следующие ошибки компоновщика:
main.obj : error LNK2001: unresolved external symbol "int __stdcall hmDocumentLAdd(char *,char *,long,char *,char *,long,long,long,long *)" (?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z)
main.obj : error LNK2001: unresolved external symbol "int __stdcall hmGetDocBasePath(char *,long)" (?hmGetDocBasePath@@YGHPADJ@Z)
Debug/HazManTest.exe : fatal error LNK1120: 2 unresolved externals
Кажется, это простой случай, когда вы забыли что-то в параметрах компоновщика: однако все кажется нормальным, и доступны файл lib, dll и исходный код. Если я изменяю загружаемый файл lib на бессмыслицу, он вызывает fatal error LNK1104: cannot open file "asdf.lib"
, так что это не проблема.
Я ранее связывался с dll, и они только что работали, так что я забыл сделать?
Обновление: согласно эта ветка Я посмотрел, смогу ли я найти дополнительную информацию. Это то, что мне дает dumpbin от VS2005.
> dumpbin /linkermember Hazardman.lib | findstr "DocumentLAdd"
F6DC __imp__hmDocumentLAdd@36
F6DC _hmDocumentLAdd@36
5B __imp__hmDocumentLAdd@36
5B _hmDocumentLAdd@36
Затем, пропустив его через undname, вы получите:
> undname ?_hmDocumentLAdd@36
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?_hmDocumentLAdd@36"
is :- "?_hmDocumentLAdd@36"
Что неверно. Если я введу искаженное имя из IDE, это даст намного лучший результат:
> undname ?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z"
is :- "int __stdcall hmDocumentLAdd(char *,char *,long,char *,char *,long,long,l
ong,long *)"
Теперь у меня есть эта информация, что мне с ней делать? Судя по этой статье Рэймонда Чена, я могу вручную исправить это, но настроить параметр, но по моим результатам я не могу определить, какой вариант необходим (есть ли флажок «игнорировать все параметры» ?!).
Таким образом, кажется, что он ищет несуществующие функции или параметры функции были отключены (или dumpbin не любит библиотеки VC6), но это все еще не приближает меня к моей цели по исправлению моей проблемы.