web-dev-qa-db-ja.com

__declspec(dllimport)ライブラリをロードする方法

http://msdn.Microsoft.com/en-us/library/9h658af8.aspx

MSDNによると、__declspec(dllexport)を使用してライブラリから関数をエクスポートできますが、このライブラリを実行可能ファイルにロードするにはどうすればよいですか?

DLLにエクスポートされた関数があります:

 __declspec(dllexport) void myfunc(){}

そして今、私はそれを私の実行可能ファイルで使用したいと思います:

 __declspec(dllimport) void myfunc(void);

しかし、私のプログラムはこの関数の場所をどのように知るのでしょうか?

12
deepspace

これはコンパイラ/リンカーの仕事です、あなたがいる限りそれは自動的に行われます

  1. リンカーオプションに.libを含めます
  2. 実行時にDLLを提供して、exeファイルで検出されるようにします。

.libファイルは、DLLのコンパイル時に生成されるか、コードでない場合は同梱されています。この場合、コードは__declspec(dllexport)でコンパイルされます。

Exeをコンパイルすると、コンパイラは、含まれている関数がDLLにあることを確認します。この場合、コードは__declspec(dllimpport)でコンパイルされます。

リンカは.libファイルで提供され、exeで適切な命令を生成します。

これらの手順により、ExeはDLLを検出し、実行時にエクスポートされた関数をロードします。DLLはExeの隣にある必要があります(他にも可能です)ただし、場所)。

__declspec(dllimpport)__declspec(dllexport)の切り替えは、マクロによって行われます DLLプロジェクト を作成するときにVisual C++によって提供されます。

11
CharlesB

DLLを使用している場合は、LoadLibraryGetProcAddressの組み合わせを使用できます。

//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();
5
Kirk Backus

ご使用のオペレーティングシステムは、リンクプロセスに基づいてそれを見つけることができます。ライブラリがプログラムに適切にリンクされている場合、ライブラリは使用されている外部関数があることを認識し、dllパスでそれを探します。見つからない場合、リンカはエラーをスローします。

リンクプロセスを読むことをお勧めします。混乱することもありますが、理解しておくと、C/C++のいくつかの重要な概念を理解するのに役立つ場合があります。

1
Forest Kunecke