http://msdn.Microsoft.com/en-us/library/9h658af8.aspx
MSDNによると、__declspec(dllexport)
を使用してライブラリから関数をエクスポートできますが、このライブラリを実行可能ファイルにロードするにはどうすればよいですか?
DLLにエクスポートされた関数があります:
__declspec(dllexport) void myfunc(){}
そして今、私はそれを私の実行可能ファイルで使用したいと思います:
__declspec(dllimport) void myfunc(void);
しかし、私のプログラムはこの関数の場所をどのように知るのでしょうか?
これはコンパイラ/リンカーの仕事です、あなたがいる限りそれは自動的に行われます
.libファイルは、DLLのコンパイル時に生成されるか、コードでない場合は同梱されています。この場合、コードは__declspec(dllexport)
でコンパイルされます。
Exeをコンパイルすると、コンパイラは、含まれている関数がDLLにあることを確認します。この場合、コードは__declspec(dllimpport)
でコンパイルされます。
リンカは.libファイルで提供され、exeで適切な命令を生成します。
これらの手順により、ExeはDLLを検出し、実行時にエクスポートされた関数をロードします。DLLはExeの隣にある必要があります(他にも可能です)ただし、場所)。
__declspec(dllimpport)
と__declspec(dllexport)
の切り替えは、マクロによって行われます DLLプロジェクト を作成するときにVisual C++によって提供されます。
DLLを使用している場合は、LoadLibrary
とGetProcAddress
の組み合わせを使用できます。
//Load the DLL
HMODULE lib = LoadLibrary("testing.dll");
//Create the function
typedef void (*FNPTR)();
FNPTR myfunc = (FNPTR)GetProcAddress(lib, "myfunc");
//EDIT: For additional safety, check to see if it loaded
if (!myfunc) {
//ERROR. Handle it.
}
//Call it!
myfunc();
ご使用のオペレーティングシステムは、リンクプロセスに基づいてそれを見つけることができます。ライブラリがプログラムに適切にリンクされている場合、ライブラリは使用されている外部関数があることを認識し、dllパスでそれを探します。見つからない場合、リンカはエラーをスローします。
リンクプロセスを読むことをお勧めします。混乱することもありますが、理解しておくと、C/C++のいくつかの重要な概念を理解するのに役立つ場合があります。