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

 
baramantan:

私はメガ・プログラマーではない。しかし、どこに普遍性があるのか理解できない:ucharは正の値にしか使えない。最小値は0、最大値は255だ。

ucharの値を超えるデータは、ucharの最大値または最小値と等しくなる。

ということを踏まえて、最初から「intやdoubleの渡し方」を聞いているのです。ついていけませんよ、部長。

では、少し説明しよう。

1.charと ucharを 例にとると、どちらも1 バイトの変数である。

つまり、互いに代入し合うことでバイト数を失うことはなく 、したがって元のデータの値を失うことも ない。

次の式を見てください。

uchar u=200; char c=u; u=c; Print(u);
c=-100; u=c; c=u; Print(c);

long/ulongint/uintについても 同じことが言える。

つまり、同じバイト数の整数型の変数同士は、バイト数の情報を失うことなく渡すことができる。

ちなみに、Expert AdvisorはMAGICの数値をulong型で受け取りますが、プログラムでは常にlong型、つまり符号付き形式で設定したり読み取ったりすることができます。


2. 次に<some_type> と uchar を見てみよう。
例えばint型。sizeof(int)でご存知のように、これは4 バイトのサイズを持っています。 これは、メモリ上のこれらの4バイトはuchar[4] 配列として簡単に表現できることを意味します。
もしdouble 8 バイトです)があれば、それはuchar[8] 配列として表現できます。
これは文字列のバイトにも当てはまります。MQLではushort配列です。
よく、それに応じて、任意の型の構造体があれば、uchar配列として簡単にデータを提供することができます。

MQL5バージョン、メモリ上の仮想ファイルCFastFileで 使用されているのは、バイトに関するこれらの基本概念です。uchar配列のメモリに任意のデータを格納します。

つまり、外部のプログラムとデータを交換する必要がない場合です。あるいは、データ・ストリームの形で他のプログラムからデータを受け取る場合、例えばインターネット・ページの読み込みなど、このデータをディスクに保存する必要がない場合は、Windowsマッピングの代わりにCFastFileを 使用する方がよいでしょう。

そして最後に、https://www.mql5.com/ja/articles/364。

 
BoraBo:

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

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

エラー1400が出る、

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


これは、32システムと64システムでポインタのサイズが異なるためです。

このライブラリファイルは32ビット端末用に作られています。

しかし、64ビット端末を使用する場合は、ポインタが暗示されるすべての場所(たとえばPBYTE、LPVOIDなど、およびすべてのmemcpy型)に8バイト長型を置く必要があります。

 

しかし、どのように私は接続する

#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 

を出します。

'GetLastError' - ambiguous call to overloaded function with the same parameters SymbolInfo.mqh  718     10
'GetLastError' - ambiguous call to overloaded function with the same parameters	SymbolInfo.mqh	725	57

そして、この2つのインクルードは、互いに関係なく機能する。

 
olyakish:

しかし、どのように私は接続する

それは

そして、この2つのインクルージョンは互いに関係なく機能する。

文脈解決を使用してみてください:
 
sergeev:
文脈解決を使用してみてください:

ありがとう

ただ、標準ライブラリを 修正する必要があったんだ。

//+------------------------------------------------------------------+
bool CSymbolInfo::CheckMarketWatch(void)
  {
//--- MarketWatchでシンボルが選択されているかチェックする。
   if(!Select())
     {
      if(::GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL)
        {
         printf(__FUNCTION__+": Unknown symbol '%s'",m_name);
         return(false);
        }
      if(!Select(true))
        {
         printf(__FUNCTION__+": Error adding symbol %d",::GetLastError());
         return(false);
        }
     }
//--- 成功
   return(true);
  }
//+------------------------------------------------------------------+
それがいいことだとは思わないけど......。
 
olyakish:

ありがとう。

ただ、標準ライブラリを 修正する必要があったんだ

それがいいことだとは思わない。

あなたはわかっていない。

私はkernel32::GetLastErrorについて お話ししました。 それが私のコードでどのように実装されているか見てください。

このオプションに満足できないなら、例えばintパラメータで kernel32 GetLastErrorからの importを宣言すればいい。

 
sergeev:

あなたは理解していない。

kernel32::GetLastErrorについて お話ししましたが、私のコードでどのように実装されているか見てください。

このオプションがあなたに合わない場合は、例えばintパラメータで kernel32 GetLastErrorからの importを宣言してください。

おそらく私はそれを正しく述べていない。

しかし、我々は

  • 標準ライブラリを 変更するか
  • を変更するか、あるいはあなたのライブラリのどこを変更するかです。

というのも、ここにあなたのコードに標準ライブラリを追加した例があるからです。

//+------------------------------------------------------------------+
//|メモマップ
//| 著作権 © 2006-2013, FINEXWARE Technologies GmbH | 著作権 © 2006-2013, FINEXWARE Technologies GmbH | その他
//|www.FINEXWARE.com
//| プログラミングと開発 - Alexey Sergeev, Boris Gershanov|アレクセイ・セルゲーエフ、ボリス・ゲルシャノフ
//+------------------------------------------------------------------+
#property copyright "著作権 © 2006-2013, FINEXWARE Technologies GmbH"
#property link      "www.FINEXWARE.com"
#property version   "1.00"
#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 


//------------------------------------------------------------------ OnStart
void OnStart()
{
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);
        
        uchar data[];
        StringToCharArray("Hello from MQL5!",data);
        err=hmem.Write(data,ArraySize(data));
        
        ArrayInitialize(data,0);
        hmem.Seek(0,SEEK_SET);
        err=hmem.Read(data,ArraySize(data));
        Print(CharArrayToString(data));
        
        hmem.Close();
}

コンパイルすると同じエラーが出ます。

 

オリャキッシュ、私があなたに書いた文章をもう一度よく読んでください。

文脈に納得がいかないのなら、私が言いたいことを正確に伝えている。

  • "あるいは、あなたのライブラリーのために何を変えるべきか"。
 
sergeev:

あなたは理解していない。

kernel32::GetLastErrorについて お話ししましたが、私のコードでどのように実装されているか見てください。

このオプションがあなたに合わない場合は、例えばintパラメータで kernel32 GetLastErrorからの importを宣言してください。

コード内のコンテキストでkernel32::GetLastErrorを 呼び出すと、コンパイラは コンテキストなしでGetLastErrorを呼び出します

プログラマーは、標準的なWinAPI関数のMQLアナローグをコンテキスト付きで呼び出すことをルール化すればよいのです。そうすれば、その後の修正に問題は生じない。

そして、標準バイブルを修正し、それが更新されるので、また編集しなければならない。

 
Urain:

それで、標準的な聖書を修正すれば更新される。

標準的なものは標準的なものだから、そこですることは何もない。エラーが発生したら、開発者に報告してください。他に方法はない。