10分でできるMQL5用DLLの書き方、データのやりとり」についてのディスカッション。 - ページ 10

 

それが、スクリプトがキックアウトされただけで、その後のエラーコードを見るにはどうしたらいいのでしょうか?あるいは、次に実行したときに、すぐに読み出せるか。

原理的には、64x用にdllをコンパイル することで問題は解決しました。とはいえ、その後、さらにエラーが出るようになったが、そんなことはどうでもよくて、一般的なc/s++用のライブラリをmql5にビルドしてリンクする方法を理解すればよかったのである。私の例では、現在正常に動作しています。

 
記事の更新はあるのでしょうか?dllの動作に変化はありますか?
 

Studio 2017をお持ちの方で、古いスタジオのためにこの説明書を見て、何をどうすればいいのかわからないという方は、まずこちらの記事(https://docs.microsoft.com/ru-ru/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2017)をお読みになることをおすすめします。

そして、この記事の例に従ってDLLを作成し、クライアントアプリケーションでテストしたら、この指示の2番目から、「MQL5プログラムでは、次のように記述して呼び出す必要があります」を読んでください。つまり、mt5に記載されている通りにDLLを宣言してください。

私はこの方法で問題を解決しました。

 

C++とMQLの型相関をマクロの形で一覧にしてほしい。

#define  MQL_STRING wchar_t
 
Renat Fatkhullin さん、DLLで配列や文字列のサイズを変更する方法についての例が必要です。realloc()で行うべきか、それとも渡されたデータは解放せず、新しいデータ配列へのポインタを変更するだけでよいのでしょうか?
 

以下は、Visual Studio 2012 C++で作成したコードです。拡張子がcppのファイルmain.(main.cpp)。

#define  MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

そして、エクスポートされた関数のリストを持つmain extension def (main.def)というファイルを作成、コードは次の ようになります。

LIBRARY "dllmt42"
EXPORTS
add

そして、それをコンパイラにインポートしました。

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

コンパイルは問題ないのですが、EAをチャート上に放置すると、混乱します

未解決のインポート関数呼び出し、'dllmt42.dll' の '_add' が見つかりました。Total Comanderは、ファイルをドラッグすると、コンパイラ本体だけでなく、関数も表示されます

誰が助けることができる、どのようにエラーで問題を解決するために、すべての後に保存し、関数の正しいエクスポートのための責任がある拡張子.defを持つファイルですか?


 
Seric29:

以下は、Visual Studio 2012のc++で作成したコードです。ファイルmain.の拡張子をcppにしたもの(main.cpp)

そして、エクスポートされた関数の リストを持つ、main extension def (main.def)のファイルを作成 しました、コードは次のようになります:

そして、それをコンパイラにインポートしました。

コンパイル後は問題ないのですが、EAをチャート上に放置すると、混乱します

未解決のインポート関数呼び出し、'dllmt42.dll' の '_add' が見つかりました。Total Comanderは、ファイルをドラッグすると、コンパイラ本体だけでなく、関数も表示されます

誰が助けることができる、どのようにエラーで問題を解決するために、すべての後に格納し、関数の正しいエクスポートのための責任がある.def拡張子を持つファイルですか?


Extern "C" は、C++であるため、エクスポートされた関数の宣言と実装の両方に追加する必要があります。そうしないと、入力された署名は「プラス」され、MT(だけでなく、他のすべての人)がそれを見ることはできません。

 
Maxim Kuznetsov:

Extern "C" は、C++がここにあるので、エクスポートされた関数の宣言と実装の両方に追加する必要があります。そうしないと、入力した署名は「プラス」になってしまい、MTは(他の人と同じように)見ることができません。

このように追加しています。

#define  MT4_EXPFUNC extern "C" __declspec(dllexport)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall
{
    return (18);
}

しかし、まだ同じことがあります -未解決のインポート関数 呼び出し、'dllmt42.dll' の '_add' を見つける... 。つまり、++のない純粋なCが必要なのでしょうか?

 
.defファイルは全く必要ありません。MQLの#importセクションにある関数を複製する必要があります。
 
Roffild:
.defファイルは全く必要ありません。MQLの#importセクションにある関数を複製する必要があります。

まあ、はい、そして、私はそれを見たりすることなく、私は行かない、まあ、それはすでにポイントを複製されているものを私に見せて?