DLL (Dynamic Link Library)

DLLの作成

DllMain()

初期化や終了処理を記述できます。

extern "C" BOOL WINAPI DllMain (
    HINSTANCE const instance,  // handle to DLL module
    DWORD     const reason,    // reason for calling function
    LPVOID    const reserved); // reserved

属性

dllexport

関数が装飾名で公開されます。

__declspec( dllexport ) declarator
dllexport、dllimport | MSDN

これは次のように利用します。

__declspec( dllexport ) void func();

dllimport

__declspec( dllimport ) declarator
dllexport、dllimport | MSDN

DLLの使用

使用するDLLがVisual Studioのプロジェクトから作成したものならば、そのプロジェクトを参照に追加することで使用できるようになります。その他の方法で作成した場合、共有ライブラリとして使用するにはコンパイル時に、

  • ヘッダーファイル (.h)
  • インポートライブラリ (.lib)

の2つが、DLL以外に必要となります。

外部から呼び出せる関数が1つも存在しないと、インポートライブラリ (.lib) は作成されません。

インポートライブラリの作成

インポートライブラリ (.lib) が提供されていないならば、.dllから作成できます。windows - How to generate an import library (LIB-file) from a DLL? - Stack Overflow

まずdumpbinで、エクスポートされたすべての定義をファイルに出力します。

dumpbin /exports target.dll > exports.txt

最初にLIBRARY DLL名、2行目にEXPORTSの記述をした、DEFファイルを作成します。Exporting from a DLL Using DEF Files | Microsoft Learn

echo LIBRARY DllName > target.def
echo EXPORTS >> target.def

DEFファイルに、最初に出力したファイルから関数定義部分だけを追記します。

for /f "skip=19 tokens=4" %A in (exports.txt) do echo %A >> target.def

最後にlibで、用意したDEFファイルからインポート ライブラリを作成します。

lib /def:target.def /out:target.lib /machine:x86

このとき64bitを対象とするならば、最後は/machine:x64とします。

インポートライブラリの参照

  • リンカーのオプションで、[追加の依存ファイル]で指定する。これは/DYNAMICBASEオプションを指定するのと同じ
  • プログラム中で、#pragmaディレクティブで指定する。
Microsoft Learnから検索