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

 
Urain:
何か保証されたテストをしなければならないと思う。でも、まだ方法がわからない。

論理的に言えば、ハンドルを閉じるとメモリ領域が解放される。

しかし、ハンドルを閉じたからといって、その領域がゼロになるわけではない。 ハンドルが閉じられても、他のソフトウェアによって上書きされるまでは、書き込まれたデータは残っている。

 
sergeev:
中間データの保存にファイルを使うのであれば、もちろん可能だ。 重要なのは、何らかの基準点でデータをディスクにリセットすることである。もし何かが起これば、情報は回復不能なほど失われてしまうからだ。
もし "何か "が起これば、いずれにせよ実際の情報は失われる。中間結果は、定期的に鉄道上のファイルにダンプすることができる。
 
sergeev:

論理的に言えば、ハンドルを閉じればこのメモリ領域は解放される。

しかし、ハンドルを閉じたからといって、この領域がゼロになるわけではない。 ハンドルが閉じられても、他のソフトウェアによって上書きされるまでは、書き込まれたデータは残っている。

ファイルが閉じられ、ハンドルが破壊され、同じ名前のファイルを開いて 必要な情報を読み込む。しかし、分散された領域は失われ、破壊されたファイルを作成せずに開くとエラーになるはずだ。これがバグなのか機能なのかはわからない。

#include <MemMapLib.mqh>
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
   CMemMapFile *hmem=new CMemMapFile();
   int err=hmem.Open("Local\\test",111,modeCreate);// ファイルを作成する

   uchar data[];
   int sizedata=StringToCharArray("Hello from MQL5!",data);
   err=hmem.Write(data,sizedata);  // と書く。
   ArrayInitialize(data,0);

   CMemMapFile hm;
   err=hm.Open("Local\\test",111); // ファイルを作成せずに開く
   uchar nextdata[];
   hm.Seek(0,SEEK_SET);
   err=hm.Read(nextdata,sizedata); // 読む
   Print(CharArrayToString(nextdata));

   ArrayInitialize(data,0);
   err=hmem.Open("Local\\test",111); // ファイルを作成せずに開く
   hmem.Seek(0,SEEK_SET);
   err=hmem.Read(data,sizedata);     // 読む
   Print("に",CharArrayToString(data));

   hmem.Close(); delete hmem; // ファイルを閉じる
   hm.Close();                // ファイルを閉じる

   ArrayInitialize(data,0);
   err=hm.Open("Local\\test",111);Print("err=",err);
   hm.Seek(0,SEEK_SET);
   err=hm.Read(data,sizedata);
   Print("その後",CharArrayToString(data));
  }
//+------------------------------------------------------------------+
 
Urain:

分散された領域は失われ、破壊されたファイルを作成せずに開くとエラーになるはずだが。

バグだと思う。

仕掛けは、メモリ上にファイル名があること。そしてシステムはそれを検出する。

 

皆さん、お願いがあります。

memcpy/strcpyが 使えないようなAPI関数を、Windows以外のAPIも含めて探してほしいのです。

つまり、何らかの理由で返されるポインタのサイズがわからない場合、あるいは返される文字列がNULL終端でなくサイズがわからない場合を見つけたいのです。


このメソッドの適用限界を見つけるのを手伝ってください。

 

MT5 642 Win7 64は、私が理解する限りでは、次の後に動作しません。

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // メモリオブジェクトを作成する。

エラー1400が出る、

しかし、Vista 32は動作します。

 

確認したところ、同じエラーが出た。しかし、=6.

 
sergeev:

確認したところ、同じエラーが出た。しかし、=6.



何かのトリックに違いない。直接起動するとerr=6になるが、デバッグモードではerr=1400になる。

 
intまたはdouble配列を転送するには?私にはできません :(
 
baramantan:
intまたはdouble配列を転送するには?私にはできません :(
sizeof(<Type>)*<Number_Elements>のlong変数として扱えばうまくいく :)