記事"DelphiでDLLをMQL5向けに書くためのガイド"についてのディスカッション - ページ 2

 
marketeer:
少なくともデバッグに関する段落を加えるべきだ。この記事ではAVが発生する可能性のある状況について触れていますが、他の潜在的なエグジステーションの原因はさておき、手動で(目で見て、あるいは頭で考えて)エラーの場所を探そうとすると、非常に長い時間がかかり、成功しないことがあります。

コメントありがとう。このセクションは、最も一般的なエラーを含むように拡張できると思います。しかし、エラーの検索に「時間がかかり、うまくいかない」ことを避けるためには、記事に書かれているとおりにすべてを行うことです。その中の例は実行可能です。それに、MetaEditorの デバッガーを使ってください。ステップ・バイ・ステップのデバッグやブレークポイントが あり、かなりまともです!

この記事では、誰かにプログラミングを教えるつもりはない。もし誰かが初歩的なミスを犯し、 、大声で叫ぶなら、その人はまだ自分のDLLを 作らず、マットの部分から学び始めるべきかもしれない。

 

HideYourRichessさん、こんにちは。

あなたはとても速いです!たくさん書いてますね! Delphiに関する自分の記事を書くべきです

私は簡単に、そして順番に答えようとします:

1. Юниты SysUtils и Classes нужно было оставить в проекте.

SysUtilsは プロジェクトにあります! SysUtils はプロジェクトにある クラスは何もすることがない!SysUtils 以外の例外ハンドラはSystemに 実装されており、デフォルトで接続されているので心配する必要はないと思います。

2. DllEntryPoint (別名DllMain)内でいろんなプロシージャを使うべきではありません。

DllEntryPointの 例は、インターネットの隅々にあります。これはDLLイベントを作成する標準的な方法で、例えばヒープからのメモリーの 確保と解放を バインドすることができます。メモリを扱うこの方法に本当に誤りがあるのなら、私はそれを考慮する用意がある。

それ以外のDllEntryPointで できないことについては、あまり使わないので議論しません。

3. メモリーマネージャーについていろいろ書かれていますね。私はあなたの結論だけを強調します

つまり、DLLとアプリケーションに単一のメモリ・マネージャを持たせることができ、それはMT4のメモリ・マネージャになります。

問題は、 MT5(MT4) のメモリ・マネージャがどのように 動作するのか 、私たちの誰も知らないということです。 また、仮にこのマネージャーを実装する関数の名前を知っていたとしても、 MT5用の API は閉じられているため、どのように使用するつもりなのでしょうか! つまり、単一のMT5マネージャーとDLLというアイデアはユートピアなのです。

読者を混乱させないために、代わりに API関数で実装された古典的なメモリ処理テクニックを使用することをお勧めします 。これは記事の文字列を扱うセクションで説明されている。

私は、ここでDelphiの 本や記事を引用する代わりに、記事の著者が、記事で説明されていることから本当に動作しないことに関連した主張だけを与えられることを期待しています。できれば例付きで。


 
avoitenko :

コメントありがとうございます。このセクションは、最も一般的なエラーを含めるために拡張することができると思います。しかし、"長く、うまくいかない "エラーを探さないためには、記事に書いてあるとおりにすべてを実行することです。その中の例は実行可能です。それに、MetaEditorの デバッガーを使ってください。ステップ・バイ・ステップのデバッグやブレークポイントがあり、かなりまともです!

この記事では、誰かにプログラミングを教えるつもりはない。もし誰かが初歩的なミスを犯し、 、大声で叫ぶなら、その人はまだ自分のDLLを 作らず、マットの部分から学び始めるべきかもしれない。

残念ながら、あなたは大きな勘違いをしている。プログラミングを学んでいる人だけでなく、熟練したプログラマーも初歩的なミスをする。

これは数学とは関係なく、デバッグ・ツールの問題なのだ。時間の80%はデバッグに費やされ、コードを書くのに費やされるのは20%だけである。私が理解する限り、この記事の目的は、実行可能なDLLの書き方を教えること、つまり、与えられた特定の例だけでなく、仮想的な他のコードも教えることだ。もちろん、すべての潜在的なエラーを考慮することは不可能ですが、原則的にエラーをキャッチする方法についての情報は必要です。そうでなければ、読者は例を再現することしかできないだろう。

DLLのデバッグ、つまりその内部について話しているのですから。

あなたは作者であり、よくご存知でしょう。私は、プレゼンテーションの不完全さについて意見を述べただけです。

 
「早いね!たくさん書いているね! Delphiの記事は自分で書くべきだよ "

これはmt4用のdllに関する古い記事からの抜粋で、未完成です。その抜粋をここにコピーしただけです。難しくないし、長くもない。

「SysUtilsは プロジェクトの中にある! クラスは関係ない!SysUtils 以外の例外ハンドラは、デフォルトで接続されているSystemに 実装されているので、心配する必要はないと思う。"

どのユニットを含めるかはオーナー次第だ。しかし、その理由を明示することは必要だと思う。この場合、SysUtilsとClassesがボーランドによって推奨されている。それには理由がある。

"DllEntryPoint "を 使った例は、インターネット上のいたるところで紹介されている。これは、DLLイベントを作成する標準的な方法であり、例えば、以下のようなものがある。

ボーランドがDllMainをいたずらから隠したのは偶然ではない。DelphiでDLLを作成する標準的な方法は、DllMainを隠すことです。なぜそうなのか考えてみてください。そして、マイクロソフト自身が推奨していることを読んでください。

"メモリ 割り当てとヒープからの解放を バインドすることができます。もし、このメモリ操作方法で実際にエラーが発生するのであれば、検討する用意はあります。"

それはあなた次第だ。しかし、私の推奨は、DllMainでは何もしないことだ。

"問題は、 MT5(MT4) のメモリーマネージャーがどのように 動作するのか 、私たちの誰も知らないということです。 また、仮にこのマネージャーを実装する関数の名前を知っていたとしても、 MT5用の API は閉じられているため、それをどのように使用するつもりなのでしょうか! だから、単一のMT5マネージャーとDLLというアイデアはユートピアだ。"

;-)ある人にとっては "クローズド "で "ユートピア "であり、別の人にとっては "すべてうまくいく "のです。

 

Delphiを使う代わりに、Lazarus/FPCを使うという選択肢もあります。

Lazarusはオープンソースで、Delphiとほとんど同じ機能を持ち(それ以上のものもあります)、Delphiのソースコードとほとんど互換性があります。

もし、あなたがプロプライエタリなソフトウェアよりもオープンソースを好むのであれば(それは、いずれにせよそうすべきことですが)、Lazarusはあなたが探しているものであり、Delphiの商用トライアル版ではありません。

 

記事の中にそのような手順がある:

//----------------------------------------------------------+
procedure DLLEntryPoint(dwReason: DWord); // イベントハンドラ
//----------------------------------------------------------+
begin
    case dwReason of

      DLL_PROCESS_ATTACH: // DLLはプロセスにアタッチされている;
          // メモリ割り当て
          Buffer:=AllocMem(BUFFER_SIZE);

      DLL_PROCESS_DETACH: // DLLはプロセスから切り離される;
          // メモリの解放
          FreeMem(Buffer);

    end;
end;

コンパイラが未宣言の変数BUFFER_SIZEは 何かと聞いてきます。

本当はどうあるべきなのか、どこで宣言されるべきなのか、何のバッファなのか教えていただけませんか?

 
lucka88:

コンパイラーは、未宣言の変数BUFFER_SIZEが 何であるかを尋ねてきます。

何があって、どこで宣言されるべきなのか、どのバッファについて話しているのか教えていただけませんか?

プロジェクト・ ファイルdll_mql5.dprには 以下の宣言があります。

const BUFFER_SIZE = 255;

行のコードで

Buffer:=AllocMem(BUFFER_SIZE);

文字列を格納するためのメモリはヒープに割り当てられる。

Bufferポインタ自体は、文字列を扱うことを示すGetStringBuffer関数で使用されます。

 

DLL ヘルプ

MT4のDLL ファイルをMT5で使うことはできますか?

また、DLLファイルはどのフォルダに保存するのでしょうか?

DLLのコードはもう持っていないので、書き直すことはできません。

どのような提案やヘルプでも結構です。

 

MT5でExpert Advisorを接続すると、「dllが64ビット版ではありません」というエラーが表示されます。

32ビットのdllを使用する方法はありますか?

もしそうでなければ、Delphi XEで64bit dllをコンパイルする方法を教えてください。

 
meneo:

Delphi XEで64it dllをコンパイルするには?

Delphi XE2とLazarusで64bitがサポートされました。