これは多くの場所で部分的に議論されていますが、それでも私にはうまくいきません.
Delphi ソースからコンパイルされた dll があります。これは、1 つの関数を 2 つの名前でエクスポートし、次を使用して dll を検査します。
>> dumpbin /EXPORTS MyLibrary.dll
次の出力が得られます。
...
17 3 00070A88 MyFunction
...
46 24 00070A88 _MyFunction@48
...
そこで、次の内容で MyLibrary.def というファイルを作成しました。
EXPORTS
MyFunction
_MyFunction@48
そして、を使用してインポートライブラリを生成しました
>> lib /def:MyLibrary.def /OUT:MyLibrary.lib /MACHINE:x86
dumpbin を使用して新しい lib ファイルを調べると、次のように表示されます。
...
_MyFunction
...
__MyFunction@48
...
そのため、どういうわけか、lib アプリケーションは関数名の前にアンダースコアを 1 つ追加しました。(どうして?)
次に、この関数を C++ プログラムで使用して、Microsoft Visual Studio C++ 2010 Express (lib ファイルを使用) でコンパイルします。
// MyLibrary.h
# define DllImport(Type) __declspec (dllimport) Type __stdcall
extern "C" DllImport(void)MyFunction(...);
// main.cpp
#import "MyLibrary.h"
...
MyFunction(....);
...
私が知る限り、これは機能するはずですが、次のリンカーエラーが発生します。
... error LNK2001: Unresolved external sympol "__imp__MyFunction@48".
なぜこれがうまくいかないのかわかりません(全体がどのように機能するのか本当にわかりません...)が、さらに2つのことを試しました。
- MyLibrary.h と main.h の関数の名前を MyFunction から _MyFunction に変更しました
- 結果:うまくいきました!しかし、なぜ?何かが明らかに間違っているので、私はこれに頼りたくありません。
- 関数の名前を MyFunction に戻し、def-File のアンダースコアを削除し、lib ファイルを再度生成してコンパイルを試みました
- 結果: コンパイルは成功しますが、プログラムを開始すると、
MyApp - Entry Point Not Found
---------------------------
The procedure entry point MyFunction@48 could not be located
in the dynamic link library MyLibrary.dll.
lib ツールとリンカーの内部動作をより深く理解する必要があると思いますが、これに関する情報はこれまでのところ見つかりませんでした。