記事"自作 DLL の排除"についてのディスカッション

 

新しい記事 自作 DLL の排除 はパブリッシュされました:

MQL5 言語機能がタスク遂行に十分でなければMQL5 プログラマーは別のツールを使用する必要があります。別のプログラム言語によって仲介DLL を作成する必要があります。MQL5 にはさまざまなデータタイプを表示し、それを API に転送する機能がありますが、残念ながら MQL5 は受け付けられたポインタからデータを抽出することに関する問題を解決することはできません。本稿ではすべての "i" にドットを打ち、複雑なデータタイプを交換し、それと連携するメカニズムを示していきます。

作者: o_O

 
質問:memcpy 関数を使うとき、例ではアドレスをintで書きましたが、システムがx64の場合、long変数を使うべきでしょうか?どのようにプログラムでシステム(x64、x86)を調べることができますか?ありがとうございました。
 

longに関する質問ですが、intを4バイトのレシーバーとして使用し、文字配列からそのようなものを受け取るのであれば、可能ですが、その必要は全くありません(つまり、&ポインターで正確に渡します)。(つまり、&ポインタで正確に渡す)。

それを知るには、 http://forum.ixbt.com/topic.cgi?id=26:37968

 
sergeev:

longに関する質問ですが、intを4バイトのレシーバーとして使用し、文字配列からそのようなものを受け取るのであれば、可能ですが、その必要は全くありません(つまり、&ポインターで正確に渡します)。(つまり、&ポインタで正確に渡す)。

どうやって調べるか - http://forum.ixbt.com/topic.cgi?id=26:37968

この構造体での交換時間(例えば、Int形式の10個の数字の場合)について、何か明確にしてもらえますか?
 
shelandr:
この構造における交換時間(例えば、Int フォーマットの 10 個の数字の場合)について、何か明確にしていただけませんか?

質問を明確にしてください。

memcpyの 速度について尋ねているのですか? これは、mqlというよりも風のライブラリの作業に関連した創造的な質問だと思います。

 
外部DLL APIとの連携に関して、最も有用で有益な記事です。ありがとうございました。
 

こんにちは。この記事が書かれたのは比較的昔のことですが、ライブラリDLLを使ったデータ交換の問題はまだ関連しています。私自身、最近ある機能を 実装する必要に迫られ、自分でDLLを書くか、それともライブラリDLLを使うかという選択を迫られました。私は後者を選択したが、当然ながら構造体の転送とデータの取得の難しさに直面した。この記事を読んだ後、私はいくつかのポイントをよく理解できなかった。この記事では、構造体を外部環境に転送する場合、ライブラリ関数が結果を置く割り当てられたメモリ領域として配列を使用することが提案されています。私はこの分野での経験がほとんどないので、おそらく私の推論は素人っぽいと思われるかもしれないが、それでも賢明な人たちが私を正してくれることを期待して、私の意見を述べることにする。古い記事(https://www.mql5.com/ja/articles/1543)で言及されている簡単な例を考えてみよう。

その記事では、ライブラリDLLを使ったファイル検索の問題を扱っている。また、必要なサイズの配列へのポインタを渡し、この配列から必要なデータを取り出すことを提案している。

構造体とは何ですか?同じメモリセクションである。では、構造体を渡してデータを取り出すアプローチを変えてみよう:

// データ型の定義を宣言する

#define  DWORD int
#define  TCHAR short // ユニコードを扱うので、このタイプを設定する。
#define  MAX_PATH (260)

// FILETIME構造体の宣言
struct FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime; 
};

// 検索結果のデータ構造を宣言する
struct _WIN32_FIND_DATA {
  DWORD dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD nFileSizeHigh;
  DWORD nFileSizeLow;
  DWORD dwReserved0;
  DWORD dwReserved1;
  TCHAR cFileName[MAX_PATH];
  TCHAR cAlternateFileName[14]; 
};

// データ型を宣言することで、WinAPIの構造をそのままコピーする。
// ライブラリ関数のインポート
#import "kernel32.dll"
   int  FindFirstFileW(string path, _WIN32_FIND_DATA& answer);
#import 
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
// 先に作成した構造体の型を持つ変数を作成する。 
   _WIN32_FIND_DATA data;
// ライブラリ関数を呼び出し、構造体へのポインタを渡す。 
int handle = FindFirstFileW(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Experts\\*.mq5", data);
   if(handle!=-1)
      {
        // 追加の変換なしに構造体のフィールドにアクセスして検索結果を表示する 
Print(「見つかったファイル名: ", ShortArrayToString(data.cFileName));   
         Print(「一時的に見つかったファイル名: ", ShortArrayToString(data.cAlternateFileName));
         Print(「見つかったファイルサイズ: ", data.nFileSizeLow); 
      }
//---
   return(INIT_SUCCEEDED);
  }
//+-
Групповые файловые операции
Групповые файловые операции
  • 2008.07.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Иногда требуется проделать одинаковые операции для некоторой группы файлов. Если у вас есть список файлов, входящих в эту группу, то это не проблема. Но если этот список нужно получить самостоятельно, то возникает вопрос: "Каким образом?" В статье предлагается сделать это с помощью функций FindFirstFile() и FindNextFile(), входящих в библиотеку kernel32.dll.
 
Алексей Барбашин: また、必要なサイズの配列へのポインタを渡し、この配列から必要なデータを取り出すという提案もある。また、必要なサイズの配列へのポインタを渡し、この配列から必要なデータを取り出すことも提案されている。

構造体とは要するに何なのか?同じメモリセクションである。では、構造体を渡してデータを取り出すアプローチを変えてみよう:

あなたのコードをエディターを通して正しく貼り付けました

 
Rashid Umarov:

あなたのコードをエディタに正しく貼り付けました。


どうもありがとう!私はまだここでコードを正しくフォーマットする方法を見つけられていません。(((

 
Алексей Барбашин:

ありがとうございます!私はまだここで適切なコードを書く方法を理解していません。(((


コードの入れ

 
Vladimir Karputov:

コードの挿入方法


ありがとうございます!調べてみます!)))