라이브러리: DLL 없는 파일 매핑 - 페이지 10

 
o_o:

적어도 컴퓨터를 다시 시작한 후 메모리에서 파일을 읽으려고하지 않습니다 ...


그래서 이런 식으로 두 터미널간에 메모리를 통해 데이터를 전송할 수 없다는 것을 이해합니까?

그리고 올바른 방법은 무엇입니까? MemMapLib.mqh를 사용하여 한 터미널에서 다른 터미널로 텍스트 문자열을 전송하는 것을 구현해야합니다.

 
Иван:

이런 식으로 두 단말기 간에 메모리를 통해 데이터를 전송할 수 없다는 것을 이해했나요?

할 수 있습니다.

한 터미널에서 다른 터미널로 텍스트 한 줄을 전송하려면 MemMapLib.mqh를 사용하여 구현해야 합니다.

파일을 생성하고, 쓰고, 읽으면 됩니다.

대략 이 순서대로

https://www.mql5.com/ko/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:

레코드를 닫는 것이 아니라 파일을 닫고 삭제하는 것입니다.

그렇기 때문에

존재하지 않는 것을 열려고 하는 것입니다.

이제야 이해가 되네요. 저는 일반 파일 작업의 비유를 따랐는데, 닫으면 파일을 삭제하는 것이 아니라 정확히 닫고 해제하는 것입니다.