【C++】DLLの使用・作成方法
DLL(lib)の作成方法
汎用的な関数などをDLLとして外出しすることで、様々なアプリから呼び出すことが可能になる。
基本的にVisualStudioでDLLのテンプレートを使って作成。
追加で以下を対応する。
▼DllFunc.h
// 関数をDLLとして出力するためのマクロ #define DLL_FUNC_EXPORT extern "C" __declspec(dllexport) // 関数の頭にマクロをつけて宣言(上記の内容が展開される) DLL_FUNC_EXPORT void DllFunction();
▼DllFunc.cpp
// 関数の中身を書く DLL_FUNC_EXPORT void DllFunction() { // 汎用的な処理など };
マクロを関数に付与することで、Libが自動的に出力される。
(プロジェクトのプロパティ > 構成の種類がEXEの場合のみ?)
DLLの使用方法
動的リンクまたは、静的リンクのいずれかを行い、DLL内の関数を使用する。
リンク方法 | 内容 | 必要な物 |
---|---|---|
動的リンク | LoadLibraryを使用する | DLL |
静的リンク | EXEにDLLのLibを組み込む | Lib |
動的リンク
// 関数ポインタを定義(DLLの関数の型に合わせる) typedef void (__stdcall* DLL_FUNC)(); // 以下でもOK? typedefは古いとか // using DLL_FUNC = void (*)(); // LoadLibraryを使ってDLLを読み込む HMODULE dll = LoadLibrary("DLLのパス"); if(dll == nullptr) { //終了 return; } // GetProcAddressを使って関数を取得する // ※キャストの仕方がCのやり方で古いから変えたほうが良いかも? auto func = (DLL_FUNC)GetProcAddress(dll, "DllFunction"); if(func == nullptr) { // 終了 return; } // 実行 func(); // DLLの破棄 if(dll) { FreeLibrary(dll); dll = nullptr; }
注意点としては、動的リンクではDLLが指定されたパスにないと失敗する。また、関数名も文字列で指定する必要があるので、間違いやすい部分もある。
静的リンク
まずプロジェクトにDLLのLibファイルを追加する。
または、"pragma comment"を使う方法でも可能
#pragma comment(lib,"Libへのパス")
▼ImportDll.h
// DLLの関数を呼び出すためのマクロ #define DLL_FUNC_IMPORT extern "C" __declspec(dllimport) // プロトタイプ宣言(Dllと関数名を合わせる) DLL_FUNC_IMPORT void __stdcall DllFunction();
▼ImportDll.cpp
// 関数を呼び出す DllFunction();