MQL4では関数から複数の値を戻すために参照渡しを使いましたが
dllにある外部関数から複数のreturnを得るにはどうすればいいでしょうか
int型の配列、int型のデータ、bool型のフラグについて確認してみます
dllの複数戻り値
複数の戻り値を得る方法をこちらで試しましたが
このままではdllには使えません
dllから複数の戻り値を取得する方法を検討してみます
配列の参照渡し
複数の値を戻すために参照渡しをつかっていましたが、その流れで
外部関数のFShift06()をdllに作成してmql4から呼び出します
引数は;
- int ¶mS[]:int型 配列の参照渡し
- int data;配列の要素数を表すintデータ
- bool dllflg:フラグとしてのbool データ
とし、関数の戻り値のboolと、配列に複数のデータを入れて返ってくるようにします
この引数なら構造体にすればMQL4内であれば可能ですが、dll には
ダメとは言っていないのですがあいまいな感じです
The following can’t be used for parameters in imported functions:
- pointers (*);
- links to objects that contain dynamic arrays and/or pointers.
Classes, string arrays or complex objects that contain strings and/or dynamic arrays of any types cannot be passed as a parameter to functions imported from DLL.
Reference: Importing Function (#import)
バラバラの引数として
MQL4とdll を以下のように作ってみます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// MQL4 ... #import "Test_DLL2.dll" bool FShift06(int ¶mS[], int data, bool dllflg); #import ... int ppp[] = {0,0,0}; int ddd = ArrayRange(ppp, 0); bool flg = true; FShift06(ppp, ddd, flg)); ... // dll bool FShift06(int* pars[], int dd, bool dflg){ bool res = false; if(dflg){ for (int i = 0; i < dd ; i++) { pars[i] = dd + i; } res = true; } return res; } |
呼び出すMQL4側はこのようにまとめます
TestSeveralReturns.mq4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
... #import "Test_DLL2.dll" bool FShift06(int ¶mS[], int data, bool dllflg); #import int count=0; ... //●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● // OnTick() //●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● void OnTick(){ // only 1 task if(count==0){ int ppp[] = {0,0,0}; int ddd = ArrayRange(ppp, 0); bool flg = true; if(FShift06(ppp, ddd, flg)){ for(int i = 0; i < ArrayRange(ppp, 0); i++){ Print("ppp[i] =" + IntegerToString(ppp[i])); } } count=1; } } |
配列に値を入れてアドレスを戻す
Visual Studio 2022を使ってdllを作成します
プロパティ設定でCコードとしてコンパイルする設定なので
それに合わせて追加変更が必要です
足りないヘッダー
“stdbool.h” などを入れます
また、参照渡しの引数はポインターに変更など
dllmain.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// dllmain.cpp : DLL アプリケーションのエントリ ポイントを定義します。 #include "pch.h" #include "stdbool.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; } __declspec(dllexport) bool FShift06(int* pars[], int dd, bool dflg) { bool res = false; if(dflg){ for (int i = 0; i < dd ; i++) { pars[i] = dd + i; } res = true; } return res; } |
ストラテジーテスターで実行してみると、
各配列要素に、dd(3)+i のデータが入れられて戻ってきているのがわかります
想定通りに動いています
関連記事:
- MQL4 dll を Visual Studio 2022 で作成
- MQL4 dll を作成 (Visual Studio 2017編)
- MQL4 dll から複数の値を戻す方法
- MQL4 dllから文字列を戻す