ネイティブ コードのデバッグに関する以前の質問に続いて、サービスを直接デバッグしてもうまくいかなかったため、コンソール アプリから簡単なテストを作成することにしました。
そこで、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 にリンクしたことがありますが、それらは機能しました。
更新:このスレッドに従って、追加情報を見つけられるかどうかを確認しました。これは、VS2005 の dumpbin が提供するものです。
> dumpbin /linkermember Hazardman.lib | findstr "DocumentLAdd"
F6DC __imp__hmDocumentLAdd@36
F6DC _hmDocumentLAdd@36
5B __imp__hmDocumentLAdd@36
5B _hmDocumentLAdd@36
次に unname を介して実行すると、次のようになります。
> 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 ライブラリが好きではありません)。