ホーム » Tips » 第1回MQL向け VS2022でDLL作成

第1回MQL向け VS2022でDLL作成

Tips

はじめに

概要

MQLから呼び出されるDLL(ダイナミックリンクライブラリ)の作成方法について説明します。
DLLはVS2022(Visual Studio 2022)のCommunity 2022を利用しての説明になりますので、使用者や用途によってにはなりますが、無料でDLLが作成できます。

VS2022は以下のサイトで「Community 2022」をダウンロード&インストールした前提で説明します。

Visual Studio 2022 の新機能 | 無料ダウンロード - Visual Studio
Visual Studio 2022 には、Live Share、AI 支援によるコード補完、その他多くのリアルタイム コラボレーションを導入するための最新の機能があります。 無料版のダウンロード。

対象となる方は、C/C++が理解できている方Windows APIについて自力で使い方を調べれる方となっております。
また、VS2022の起動手順や使用している用語説明等の初歩的な部分は省略しますのである程度の基本知識はある方向けです。

ご注意

ここに記載された内容は、公式情報を調べて書いた内容ではなく、あくまでも私の実務経験からの知識で書いた内容になります。そのため、間違った情報もあるかもしれませんがご理解下さい。
御指摘等頂ければ随時修正していきたいと思います。

ご連絡は私のTwitterへ連絡いただけるとありがたいです。

VS2022のインストールについて

VS2022のインストールについてですが、私のPCは既にインストール済みなので、インストールに関する説明は省略致します。
注意点としては、今回C++によるDLL作成をご説明しますのでC++によるデスクトップ開発を選択してインストールしてください。

DLL作成手順

プロジェクトの新規作成

統合開発環境(IDE)である「Visual Studio 2022」を起動すると以下の画面が立ち上がります。右側にある「新しいプロジェクトの作成」を選択してください。

新しいプロジェクトの作成画面になりますので、右上の「テンプレートの検索」に「DLL」と入力して検索してください。
※この画面はVS2022のインストール状況等によって多少個人差がでます

ダイナミック リンク ライブラリ(DLL)」という選択肢がでてきたら選択して「次へ」をクリックしてください。
※この選択肢が出ない場合はインストールする項目が足りていないので見直ししてください

新しいプロジェクトを構成しますの画面になります。
以下を指定してください。

  • プロジェクト名
    DLLの名称として利用される名前です。
    ここでは「HogeHoge」として「HogeHoge.dll」を作成します。
  • 場所
    プロジェクトの作成場所のフォルダーを指定します。

「ソリューションとプロジェクトを同じディレクトリに配置する」はチェックしておいてください。

指定したら「作成」をクリックしてください。
「HogeHoge.dll」用のプロジェクトが作成されます。

関数の追加

以下の関数を追加を例にして説明します。
使い方としては一般的ではありませんが、説明用であえてポインターを利用しています。

void SetHogeHoge(int iSetValue);
BOOL GetHogeHoge(int* piGetValue);

適当な処理の2つの関数を追加して「dllmain.cpp」を以下のようにしました。

// dllmain.cpp : DLL アプリケーションのエントリ ポイントを定義します。
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

int g_iValue = -1;
///////////////////////////////////////////////////////////////////////////////
// Setter
__declspec(dllexport) void SetHogeHoge(int iSetValue)
{
    g_iValue = iSetValue;
}
///////////////////////////////////////////////////////////////////////////////
// Getter
__declspec(dllexport) BOOL GetHogeHoge(int* piGetValue)
{
    BOOL bResult = FALSE;
    if (-1 != g_iValue) {
        *piGetValue = g_iValue;
        bResult = TRUE;
    }
    return bResult;
}

関数の定義に「__declspec(dllexport)」が付与されている点を除けば、何をやっている関数かは理解できる方がここまで読んでいると思いますので説明は省略します。
「__declspec(dllexport)」については、外部(mqlから)呼び出される関数に付けるということだけ覚えておいてください。

defファイルの追加

この状態でもDLLは作成されます。
メニューにある「ソリューションのビルド」等でビルドするとDLLが作成されます。

しかし、このままでは外部からの呼び出しすることができませんのでdefファイルで関数の定義をします。
「dllmain.cpp」のフォルダに「HogeHoge.def」というファイルを作成して、ファイルの中身を以下にしてください。

LIBRARY "HogeHoge"

EXPORTS
        SetHogeHoge
        GetHogeHoge

「LIBRARY」がDLLのファイル名になります。
「EXPORTS」にDLLが外部から呼び出される関数名を1関数1行で定義します。

「HogeHoge.def」を作成したらVS2022の「ソリューションエクスプローラー」のソースファイルの中にファイルをドラッグしてください。
このようになるはずです。

defファイルの適用

defファイルを作成して追加はしましたが、ビルドに適用させる必要があります。
ビルドにおいては、ビルド方法が複数パターンありますのでパターンごとに適用が必要になりますので、注意して設定してください。
まずは、適用させるためにプロジェクトを選択します。
ソリューションエクスプローラーで、「HogeHoge」を選択してください。

選択したまま、右クリックで表示されるメニューの「プロパティ」を選択してください。(一番下です)

「HogeHoge プロパティ ページ」ダイアログが開くので、

  • 構成すべての構成
  • プラットフォームすべてのプラットフォーム

に変更してください。(※前述のパターン毎の適用はこれで一括設定できます)
変更後、左のツリーペイン上で、「構成プロパティ」-「リンカー」-「入力」を選択して、
「モジュール定義ファイル」に「HogeHoge.def」を入力してください。

もし「プロパティ ページのプラットフォームへの変更を保存しますか?」というメッセージボックスがでたら、正しい入力であることを確認して「はい」を選択してください。

MT4用のDLLビルド

MT4用のDLLをビルドする場合はVS2022のツールバーにある選択を以下に変更してください。

変更後、メニューの「ビルド」-「ソリューションのビルド」を選択してください。

「成功 1」となっていれば「HogeHoge.dll」の作成が成功しています。
\HogeHoge\Release\HogeHoge.dll」がMT4用のDLLです。
MT4のデータフォルダを開いて「MQL4\Libraries」に格納して利用できます。

MT5用のDLLビルド

MT5用のDLLをビルドする場合はVS2022のツールバーにある選択を以下に変更してください。

\HogeHoge\x64\Release\HogeHoge.dll」がMT5用のDLLです。
MT5のデータフォルダを開いて「MQL5\Libraries」に格納して利用できます。

最後に

MQLを使いこなせるようになると、MQLだけでできる事の限界の壁にぶつかります。
MQLからWindowsAPIを呼び出すことでその壁を乗り越えることも可能ですが、意図的なのは想像つきますが、MQLにはポインターが使えないという欠点があるため乗り越えれない壁がどうしてもあります。
WindowsAPIを呼び出しても動かない、落ちるということも様々な使い方をしているとすぐに直面します。

それらの壁をさらに乗り越えるのがDLLを利用する利点です。

今回、割と難関となるDLLの作成のみの記載でしたが、どうやって使うの?といった部分は反響次第と致します。

コメント

タイトルとURLをコピーしました