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

 
o_o:

En azından bilgisayarı yeniden başlattıktan sonra bellekteki bir dosyayı okumaya çalışmazsınız...


Yani bu şekilde iki terminal arasında bellek üzerinden veri aktarımı yapamayacağımı mı anlıyorum?

Peki doğru yol nedir? MemMapLib.mqh kullanarak bir metin dizesinin bir terminalden diğerine aktarılmasını uygulamam gerekiyor.

 
Иван:

Yani bu şekilde iki terminal arasında bellek üzerinden veri aktaramayacağımı mı anlıyorum?

Yapabilirsin.

MemMapLib.mqh kullanarak bir satır metnin bir terminalden diğerine aktarımını gerçekleştirmeniz gerekir.

bir dosya oluşturun, yazın, sonra okuyun.

kabaca şu sırayla

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

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

Bellekteki açık bir dosyaya yazabileceğim ve sonra okuyabileceğim maksimum veri miktarı nedir?

4096'dan sonra Uzman Danışman bu noktada çökmeye başlar.

 
Bana kodu ve çıktıyı ver
[Silindi]  
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); 
} 

Merhaba, yukarıdaki kodda "return(0)" "return(m_hmem)" olarak düzeltilmelidir, aksi takdirde bellek eşlemeli dosyanın tanıtıcısını döndürmez.

 

Bir dosyaya 200 karakter uzunluğunda bir dize yazmaya çalıştım, kütüphanenin 214. satırında dizi boyutunu aşma hatası aldım. Görünüşe göre, alıcı dizinin boyutu belirlenirken başlık boyutu dikkate alınmıyor.

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

Çalışıyor.

çalışmıyor.

Bana kodu ve mili ver.

 
o_o:

Çalışmıyor.

Bana kodu ve çıktıyı ver


   string control_text = "Annemiz yüksek sesle ağlıyor çünkü herkes domuz gibi yiyor. Sus anne, ağlama! Diğerlerinde de aynı bok var...";
   string NAME_MAPPING = "Local\\" + Symbol() + "_" + (string)ChartID();
        
   uchar Data_sender[];
   int size_data = StringToCharArray(control_text, Data_sender);

  //--- Bir bellek nesnesi oluşturun
   CMemMapFile* MappingFile = new CMemMapFile();
  //--- Kayıt için bir dosya oluşturun
   long err = MappingFile.Open(NAME_MAPPING, size_data+4, modeCreate);
        
  //--- Dosyaya veri yaz
   err = MappingFile.Write(Data_sender, size_data);
        
  //--- Kaydı kapatın
   MappingFile.Close();
  //--- İşaretçiyi sil
   delete MappingFile;
   
   uchar Data_receiver[];
   ArrayResize(Data_receiver, size_data);
   
   //--- Bir bellek nesnesi oluşturun
   CMemMapFile* MF = new CMemMapFile();
   //--- Dosyayı okumak için açın
   err = MF.Open(NAME_MAPPING, size_data+4, modeOpen);
   //--- Сдвигаем указатель чтения на начало файла
   MF.Seek(0,SEEK_SET);
   //--- Читаем данные из файла
   err=MF.Read(Data_receiver, size_data);
   //--- Dosyayı kapatın 
   MF.Close();
  //--- İşaretçiyi sil
   delete MF;

   Print(CharArrayToString(Data_receiver));

Boyutları buldum. Ancak dosyayı başka bir nesne ile okumaya çalıştım ve çıktıda sessizlik aldım. Hata nerede?

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

Boyutları buldum. Ancak dosyayı başka bir nesne ile okumaya çalıştım ve çıktıda sessizlik aldım. Hata nerede?

//--- Kaydı kapatın

Buna bir kaydı kapatmak denmez, bir dosyayı kapatmak ve silmek denir.

Bu yüzden

//--- Dosyayı okumak için açın
var olmayan bir şeyi açmaya çalışıyorsunuz.
 
o_o:

buna kaydı kapatmak denmez, dosyayı kapatmak ve silmek denir.

Bu yüzden

var olmayan bir şeyi açmaya çalışıyorsun.

Tamam, bu mantıklı. Normal dosyalarla çalışma benzetmesini takip ediyordum, kapatma işlemi dosyayı silmeye değil, tam olarak kapatmaya ve serbest bırakmaya yol açar.