記事"データの交換方法:10分で書くMQL5のためのDLL"についてのディスカッション

 

新しい記事 データの交換方法:10分で書くMQL5のためのDLL はパブリッシュされました:

シンプルなDLLを書く方法や異なるシステム バインディングの特殊機能は何かを覚えている開発者はあまりいないと思います。いくつか例を挙げながら、10分でDLLを書く手順を網羅するとともに、バインディング実装の技術的詳細もいくらか説明していきたいと思います。異なるタイプの変数(数値、配列、ストリングなど)に置き換えた例を取り上げ、ビジュアル スタジオでDLLを作成する手順を段階的にお見せしていきます。それに加え、カスタムDLLのクラッシュからクライアント端末を保護する方法についてもご説明します。

新規DLL プロジェクト

作者: MetaQuotes

 

良い記事だが、いくつかの大きな懸念がある。

5. DLL calls wrapper and loss of speed on calls

As already described above, every call of DLL functions is wrapped into a special wrapper in order to ensure safety. 
This binding masks the basic code, replaces the stack, supports stdcall / cdecl agreements and monitors exceptions within the functions called.

This work inevitably leads to delay of the calling function. 
Therefore, it isn't recommended to perform very frequent DLL function calls (hundreds or thousands of times per second) for small operations. 

It' s better to make infrequent calls.

私はアプリケーションの保護を追加することには賛成ですが、パフォーマンスを犠牲にすることには賛成できません。 これはMT4からのもう一つの変更で、dllの例外がMT4をクラッシュさせますが、よく書かれたコードはこのシナリオを処理するはずです。 私はむしろ、この種の問題を克服するためのdllの安全なコードの書き方に関する記事を見たいのです。 つまり、悪いコーディング習慣のために、誰もがパフォーマンスの犠牲を払わなければならなくなったのです。

これは、ティックベースで呼び出されるアルゴリズムのライブラリを持っている場合、非常に非常に悪いことであり、私はあえてそれらを無用のものにすると言うでしょう。 MT5に関して私が見てきたフィードバックの大部分は、人々がインジケータなどを書き換える 必要があるため、良いものではありません。

なぜMetaquotesは、安全な方法でDLLを呼び出すための少し異なる方法を追加できなかったのでしょうか。そうすれば、開発者は安全なローディングかパフォーマンス・ローディングかを選ぶことができるし、例外をキャッチする良いコードを書くことができる。

「頻繁に呼び出さない方がいい "って、マジでどういうことだ?

 

Visual C++ Express 2008を使ってDLLをコンパイルしたのですが、興味深いことにターミナルが例外をキャッチせず、fnReplaceStringの中でクラッシュしてしまいます。

私のターミナルのビルドは239です。何か手がかりはありますか?



 
investeo:

Visual C++ Express 2008を使用してDLLをコンパイルしましたが、興味深いことにターミナルは例外をキャッチせず、fnReplaceStringの内部でクラッシュします。

私のターミナルのビルドは239です。何か手がかりはありますか?

ex5とdllを送ってもらえますか?
 
pfx:

良い記事だが、大きな懸念を抱かせる。

私はアプリケーションの保護を追加することには賛成だが、パフォーマンスを犠牲にすることには賛成できない。 これはMT4からの別の変更で、dllの例外がMT4をクラッシュさせるが、よく書かれたコードはこのシナリオを処理するはずだ。 私はむしろ、この種の問題を克服するためにdllで安全なコードを書くための記事を見たい。 悪いコーディング習慣のせいで、今や誰もがパフォーマンスの犠牲を払わなければならないのだ。

これは、ティックベースで呼び出されるアルゴリズムのライブラリを持っている場合、非常に非常に悪いことであり、私はあえてそれらを無用のものにすると言うでしょう。 MT5に関して私が見てきたフィードバックの大部分は、人々がインジケータなどを書き換える 必要があるため、良いものではありません。

なぜMetaquotesは、安全な方法でDLLを呼び出すための少し異なる方法を追加できなかったのでしょうか。そうすれば、開発者は、安全なローディングかパフォーマンス・ローディングかを選択することができ、例外をキャッチする良いコードを確実に書くことができる。

「頻繁に呼び出さない方がいい "って、マジでどういうことだ?

このコミュニティがまともな記事を書くのが難しいのは当然だ。 どんな優秀なライターでも、わざわざ時間を費やしてここに書こうとはしないだろう。 なぜそうする必要があるんだ? dllを組み込んで通信を確立する方法を示すようなまともなことをやっても、誰かがやってきて木から叩き落とされるんだ。

私が見たところ、彼はこの記事でまともな仕事をしたようだ。

あなたがそれを持ち出すのは良いことだが、解決策を提示したり、目標を達成する方法を提案したりする気がないのであれば、文句を言っても誰も得をしない。

この記事でリスクが露呈したかというと、その通りだ。しかし、彼はリスクを明らかにし、あなたのような人が「安全」というトピックのコンセプトそのものによって、それを発展させる余地を十分に残した。

個人的なことだが、トピックを書くとき、初心者というような言い方は慎んでほしい。 それは侮辱的で品位を下げるものであり、自分の知恵についてきてほしいと願う人たちに対するプロフェッショナルな言い方ではない。

 

このDLLインポート機能を使って、C#のような他の言語で書かれたDLLをインポートできるのかどうか、ずっと考えていました。可能なのでしょうか?

C++ dllとC# dllの違いは何ですか?

 
ToolMaker:

C++ dllとC# dllの違いは何ですか?

C# dllのアセンブリはマネージド・コードを格納するために使用され、C++ dllにはネイティブ・コードが格納される。

しかし、アセンブリのインポートを可能にするトリックがある。

僕としては、そのためにc++cliのラッパーDLLを書くか、c++cliを使ってすべてのマネージド・コードを書くのが普通だ。

 

C++ライブラリに構造をインポートする方法を教えてください。


------------------------
structMqlTick

{
INT64 Time;
double Bid;
double Ask;
double Last;
UINT64 Volume;
};

_DLLAPI MqlTick __stdcall MyTick(MqlTick &my)
{
my.Bid = 1;
return(my);
}
------------------------

次に、MQL5DLL Test.mq5(importセクション)に次のコードを追加する。

MqlTick MyTick(MqlTick &tick);

そしてOnTick()でそれを呼び出す

MqlTick tick;
SymbolInfoTick("GBPUSD", tick);
MyTick(tick);
Print("My tick: ",tick.bid);
------------------------

c++ライブラリとEAのコンパイルはエラーなし。

ターミナルでMyTick(tick)ファンクションを呼び出すとエラーが発生します:MQL5DLL_Test (EURUSD,M1) 0x00000008へのアクセス違反書き込み

 

こんにちは。

mql5とmysqlの間でデータを交換するための小さなDLLを作成しようとしました。

いろいろなステップを踏んだのですが、いくつかエラーが発生しました。

dllはc++です。

最初のものはminGWでコンパイルされました。

ex5は64ビットコンパイルされたdll ではなかったため、それを開くことができなかった。

そこで、64ビットのminGWでコンパイルした。

私の最初のDLL(非常に単純なもの)は動作する。

いくつかの追加を行った。

mysqlライブラリを使おうとすると、問題なくコンパイルしてDLLをビルドできる。

しかし、それを呼び出しているex5を開こうとすると、次のようなエラーが出ました:

C:◆user......◆DLLNAME.dllを開けません。

これを解決する方法はありますか?

ありがとうございます。

 

皆さん、こんにちは、

素晴らしい記事ですね!


でも、この記事で説明されているようなことを、逆にやってみたいのですが、どなたか教えていただけませんか?メタトレーダーからC++プログラムにデータ(ティックやバーのデータ)を取り込むことはできますか?

 

標準的なint配列で動作していますが、CArrayObj /CArrayDoubleを Visual Studio C++に渡すことはできますか?