12

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

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

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

 __declspec(dllexport) void myfunc(){}

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

 __declspec(dllimport) void myfunc(void);

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

4

3 に答える 3

12

これはコンパイラ/リンカの仕事です。

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

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

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

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

これらの命令により、Exe は DLL を見つけ、実行時にエクスポートされた関数をロードします。DLL は Exe の隣にある必要があります (ただし、他の場所も考えられます)。

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

于 2013-07-29T22:17:56.240 に答える
6

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();
于 2013-07-29T22:21:20.020 に答える
1

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

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

于 2013-07-29T22:16:18.273 に答える