もくじ
→https://tera1707.com/entry/2022/02/06/144447
やりたいこと
C++で作ったDLLを、C++から、動的に呼び出したい。
動的にDLLを呼ぶ
やり方は、下記の2つある。
このうち、動的に呼び出すのを今回やる。
(静的に呼ぶ方はこちらを参照。)
呼出方法 | やり方概要 | DLL読込タイミング | 必要ファイル |
---|---|---|---|
静的 | DllImportして、必要な関数をextern宣言し、使用する。※1 | プログラム開始時 | dllファイル(実行時)/libファイル(ビルド時) |
動的 | LoadModuleでDllを読込み、LoadLibraryで関数を読込む。※2 | 任意 | dllファイル(lib不要) |
※1
関数のプロトタイプ宣言とLIBファイルの指定(コンパイラオプションでの指定または#pragma)のみで通常の関数の様に使える。
※2
LIBファイル・ヘッダーファイルのないDLLに使用できる。
DLL側(C++)
以前の記事で書いたものと同じのを使う。
呼びだす側(C++)
静的にDLLを呼ぶときに行ったような、.libの参照設定や、DllImportは不要。
代わりに、以下のようなことを行う。
コード上で、DLLの読み込み
下記のようなことを行う。
- LoadLibrary()を使用して、DLLファイルを読み込む。
- GetProcAddress()を使用して、DLL内の関数(アドレス)を取得。
- 関数コール実施。
ConsoleApplication2.cpp
#include "pch.h"
#include <windows.h>
typedef void(*FUNC1)();
typedef void(*FUNC2)(const wchar_t* str1, const wchar_t* str2);
typedef void(*FUNC3)(int count);
int main()
{
// DLL呼び出し
HMODULE hModule = LoadLibrary(L"DllTest.dll");
if (NULL == hModule) return 1;
// 関数読み込み
FUNC1 func1 = (FUNC1)GetProcAddress(hModule, "Test_MyApi");
FUNC2 func2 = (FUNC2)GetProcAddress(hModule, "Test_MyApi2");
FUNC3 func3 = (FUNC3)GetProcAddress(hModule, "Test_MyApi3");
// 関数コール実行
func1();
func2(L"あいうえお", L"かきくけこ");
func3(4);
return 0;
}
参考
呼び出し規約の種類(cdeclとか、stdcallとか)
https://konuma.org/blog/2006/01/02/post_1fd3/
extern "C" とは?
https://konuma.org/blog/2006/01/04/post_144e/
DLLを静的リンクで呼び出す
http://yamatyuu.net/computer/program/sdk/base/static_dll/index.html
コード