Kütüphaneler: DLL olmadan Dosya Eşleme - sayfa 8

 
o_O:
CMemMapFile::Open'ın bir hata kodu ya da hata olmadığında 0 döndürdüğünü yazmıştım.

Konuşmanın başında CMemMapFile::Open fonksiyonunun ne döndürdüğüne dair bir ekran görüntüsü paylaşmıştım.

Sanki hata yokmuş gibi 0'dı.


Sonra tutamacın NULL olup olmadığını görmek için düzelttim.

Print(__FILE__,", handle=",MapFile.m_hmem);

ve sonuç olarak

2016.03.04 19:00:00.897 BuyNow Client v 1.03 USDCHF.m,M5: BuyNow Client v 1.03.mq4, handle=8589934592

Hata yok, bir tutamaç var, başka neye ihtiyacın var diyebilirsiniz... ama kimse dosya görüntüsünü oluşturmadı... Ve oluşturulmamış bir eşlemeyi açmak imkansız.

Ya da belki bu eşleme başka biri tarafından oluşturuldu ve benim bundan haberim yok????

Bazı programlar tam olarak bu isimde bir ekran oluşturur :-)

#define HADER "BuyNow v10"
CMemMapFile MapFile;
long handl;
int OnInit()
  {

//--- zamanlayıcı oluştur
//---
      EventSetMillisecondTimer(Timer);
      handl=MapFile.Open(StringConcatenate("Local\\","_",HADER,"_",GetSymbol(),"_",((ServerAccauntNumber==0) ?  AccountNumber():ServerAccauntNumber)),BUF_SIZE+HEAD_MEM,modeOpen);
      Print(__FILE__,", handle=",MapFile.m_hmem);
//---
   return(INIT_SUCCEEDED);
  }
 

Dmitry Luck'janenko:


Ya da belki bu eşleme başka biri tarafından oluşturuldu ve benim bundan haberim yok ???.

Bazı programlar tam olarak bu isimde bir eşleme oluşturuyor :-)


Peki, bundan önce kendiniz bir şey yarattınız)

yazılım sadece hafıza ile böyle çalışır. Hiçbir şeyi bir kerede temizlemez. Bu yüzden eski veriler takılabilir ve açılabilir.

Ancak üzerine yazıldığında açılmaz. Muhtemelen açılışlar arasında bir şey yapmadınız.
 

Mükemmel bir kütüphane, mutekslerle birlikte yerel bir kopyalayıcı yazmak için kullandım

Alıcı için önemli bir bileşen olarak dosya boyutunu aldım ve bundan bir döngü oluşturdum,

Birkaç hata buldum - ArrayOutOfRange veya 4 bayt eksikliği.

Sabit

//------------------------------------------------------------------ Write
int CMemMapApi::Write(HANDLE64 hmem, const uchar &buf[], DWORD pos, int sz, DWORD &err) // belirtilen sayıda baytı belleğe yazar
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // eğer açık değilse
        DWORD size=GetSize(hmem, err); if (pos+sz>size) { UnViewFile(view); return(-2); }; // boyut daha küçükse, çık
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM); 
        memcpyX(src, view, size+HEAD_MEM); // bytebuffer'ı aldı
        for(int i=0; i<sz; i++)
        { 
        src[pos+i+HEAD_MEM]=buf[i]; // belleğe yazılır
        }
        memcpyX(view, src, size+HEAD_MEM); // geri kopyalandı
        UnViewFile(view); // görünümü kapattı
        return(0); // Tamam olarak döndü.
}
//------------------------------------------------------------------ Read
int CMemMapApi::Read(HANDLE64 hmem, uchar &buf[], DWORD pos, int sz, DWORD &err) // bellekten belirtilen sayıda bayt okur
{
        if (hmem==NULL) return(-1);
        PBYTE64 view=ViewFile(hmem, err); if (view==0 || err!=0) return(-1); // eğer açık değilse
        DWORD size=GetSize(hmem, err); // boyutu aldım
        uchar src[]; 
        ArrayResize(src, size+HEAD_MEM);
        memcpyX(src, view, size+HEAD_MEM); // bytebuffer'ı aldı
        ArrayResize(buf, sz);
        int i=0; 
        for(i=0; i<sz && pos+i<size; i++) 
        {
        buf[i]=src[pos+i+HEAD_MEM]; // baytları oku
        //i++;
        }
        UnViewFile(view); // görünümü kapattı 
        return(i); // kopyalanan bayt sayısı
}
 

Eğer MQL5 ile MMF oluşturursam ve ona yazarsam ve sonra onu okursam.

Ancak MMF'yi başka bir programla oluşturursam, yazmaya veya okumaya çalıştığımda kritik bir hata oluşuyor.

Sorun nedir?

 
Alex19791979:

Eğer MQL5 ile MMF oluşturursam ve ona yazarsam ve sonra onu okursam.

Ancak MMF'yi başka bir programla oluşturursam, yazmaya veya okumaya çalıştığımda kritik bir hata oluşuyor.

Sorun nedir?


Telepatlar kulübü kritik hatanın numarasını tahmin etmek için çok uğraşıyor.

 
Alexey Volchanskiy:

Telepatlar kulübü gergin bir şekilde kritik hatanın sayısını tahmin etmeye çalışıyor.

topikstarter telepati̇k etki̇den engellendi̇
 

Hata kodu olmayan MT5 kritik hata mesajı. Bir kod olsaydı, belirtilirdi.

 
Alex19791979:

Ancak MMF'yi başka bir programla oluşturduysam, yazmaya veya okumaya çalıştığımda kritik bir hata oluşuyor.

Sorun nedir?

-
dosyasını açarken herhangi bir hata olup olmadığını kontrol edin - diziler/dizelerle çalışmanın tüm işlevlerinde okuma/yazma için ayrılan kullanılabilir birimi kontrol edin (2 baytı dikkate alın)
vb.

 

Sorun çözüldü.

MMF dosyalarını üçüncü taraf bir uygulama tarafından 0'dan değil 4 bayttan başlayarak yazmak ve okumak gerekir.

Ve MT5 için ofset 0 olsa bile 4 bayt sayılmaz.

Bu nedenle, üçüncü taraf bir program 0 bayttan yazdığında, MT5'i okumaya çalışırken bir hata oluştu.

 
Alex19791979:

Sorun çözüldü.

MMF dosyalarını üçüncü taraf bir uygulama tarafından 0'dan değil 4 bayttan başlayarak yazmak ve okumak gerekir.

Ve MT5 için ofset 0 olsa bile 4 bayt sayılmıyor.

Bu yüzden üçüncü parti bir program 0 bayttan yazdığında, MT5'i okumaya çalıştığımda bir hata oluştu.

Belki de sınıftaki ilk baytların dosya boyutunun saklandığı başlık için ayrıldığını dikkate almadınız?