おとついの晩ご飯

忘れやすいので忘れたくないことを書いています。

【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ファイルを追加する。 f:id:meme1111aMOMO:20210618065147p:plain

または、"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();