ライブラリ: DLLなしでのファイルマッピング - ページ 10

 
o_o:

少なくとも、コンピュータを再起動した後にメモリ上のファイルを読み込もうとはしない...。


ということは、この方法では2つの端末間でメモリーを介してデータを転送することはできないということですね?

正しい方法は何ですか?MemMapLib.mqhを使って、ある端末から別の端末へのテキスト文字列の転送を実装する必要があります

 
Иван:

つまり、この方法では2つの端末間でメモリーを介してデータを転送することはできないということですね?

できます

MemMapLib.mqhを使って、ある端末から別の端末へのテキスト行の転送を実装する必要があります

ファイルを作成し、書き込み、そして読み込む。

だいたいこの順番

https://www.mql5.com/ja/code/10571

 
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);

メモリ上のオープンファイルに書き込んで読み込めるデータの最大量は

4096を超えるとExpert Advisorがクラッシュします。

 
コードとピン配置を教えて
削除済み  
HANDLE64 CMemMapFile::Open(LPTSTR path, DWORD size, int mode=modeOpen) 
{ 
m_size=size; m_path=path; m_mode=mode; m_pos=0; // начальное положение 
if (m_path=="") return(-1); 
m_hmem=Open(m_path, size, mode, err); 
if (m_hmem==NULL) return(err); // если ошибка создания 
return(0); 
} 

こんにちは、上記のコードで "return(0) "を "return(m_hmem) "に修正する必要があります。

 

200文字の文字列をファイルに 書き込もうとしたところ、ライブラリの214行目で配列サイズを超えるというエラーが出た。受信配列のサイズを決定する際に、ヘッダーのサイズが考慮されていないことが判明した。

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

機能している

動かない。

コードとスピンドルを教えて

 
o_o:

うまくいかないんだ。

コードとプリントアウトをくれ


   string control_text = "私たちのママが大声で泣いている。ママ、泣かないで!他の人たちも同じよ...";
   string NAME_MAPPING = "Local\\" + Symbol() + "_" + (string)ChartID();
        
   uchar Data_sender[];
   int size_data = StringToCharArray(control_text, Data_sender);

  //--- メモリ・オブジェクトを作成する
   CMemMapFile* MappingFile = new CMemMapFile();
  //--- 録音用のファイルを作成する
   long err = MappingFile.Open(NAME_MAPPING, size_data+4, modeCreate);
        
  //--- データをファイルに書き込む
   err = MappingFile.Write(Data_sender, size_data);
        
  //--- レコードを閉じる
   MappingFile.Close();
  //--- ポインターを削除する
   delete MappingFile;
   
   uchar Data_receiver[];
   ArrayResize(Data_receiver, size_data);
   
   //--- メモリ・オブジェクトを作成する
   CMemMapFile* MF = new CMemMapFile();
   //--- 読み込み用にファイルを開く
   err = MF.Open(NAME_MAPPING, size_data+4, modeOpen);
   //--- Сдвигаем указатель чтения на начало файла
   MF.Seek(0,SEEK_SET);
   //--- Читаем данные из файла
   err=MF.Read(Data_receiver, size_data);
   //--- ファイルを閉じる 
   MF.Close();
  //--- ポインターを削除する
   delete MF;

   Print(CharArrayToString(Data_receiver));

寸法はわかりました。しかし、別のオブジェクトでファイルを読み込もうとしたところ、出力が無音になってしまいました。エラーはどこですか?

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

寸法はわかった。しかし、そのファイルを別のオブジェクトで読み込もうとしたところ、出力が無音になってしまいました。エラーはどこですか?

//--- レコードを閉じる

レコードを閉じるのではなく、ファイルを閉じて削除 するのです。

だから

//--- 読み込み用にファイルを開く
存在しないものを開こうとしている。
 
o_o:

レコードを閉じるのではなく、ファイルを閉じて削除 するのだ。

だから

存在しないものを開こうとしているわけだ。

なるほど、納得です。私は通常のファイルを扱うときの例えを追っていたのですが、閉じるということは、ファイルを削除することではなく、まさに閉じて解放することにつながるのですね。