19
25

More than 1 year has passed since last update.

【C++】C++で作成したDLLをC++で呼ぶ(動的)

Last updated at Posted at 2019-04-02

もくじ
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

コード

19
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
25