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

 
Urain:
일종의 보장된 테스트를 해야 할 것 같아요. 하지만 아직 방법을 모르겠습니다.

논리적으로 말하면 핸들을 닫으면 메모리 영역이 해제됩니다.

하지만 핸들을 닫는다고 해서 이 영역이 0으로 지워지는 것은 아닙니다. 핸들을 닫아도 다른 소프트웨어가 덮어쓸 때까지 기록된 데이터는 그대로 남아 있는 것이죠.

 
sergeev:
중간 데이터를 저장하는 데 파일을 사용하는 경우 물론 가능합니다. 중요한 것은 어떤 일이 발생하면 정보가 복구할 수 없게 손실되기 때문에 일부 기준점에서 데이터를 디스크로 재설정하는 것입니다.
"어떤 일이 발생"하면 실제 정보는 어떤 경우에도 손실됩니다. 그리고 중간 결과는 예, 주기적으로 철도의 파일에 덤프할 수 있습니다.
 
sergeev:

논리적으로 말하면 핸들을 닫으면 이 메모리 영역이 해제됩니다.

하지만 핸들을 닫는다고 해서 이 영역이 0으로 지워지는 것은 아닙니다. 핸들을 닫으면 다른 소프트웨어가 덮어쓸 때까지 기록된 데이터는 남아 있으므로 다음과 같이 진행됩니다.

파일이 닫히고 핸들이 파괴되고 같은 이름의 파일을 열고 필요한 정보를 읽지만 아이디어에 따라 분산 영역이 손실되어야하고 파괴 된 파일을 만들지 않고 열면 오류가 발생해야합니다. 이것이 버그인지 기능인지 모르겠습니다.

#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:

배포된 영역이 손실되어야 하는데 생성하지 않고 파괴된 파일을 열면 오류가 발생합니다.

버그인 것 같습니다.

트릭은 메모리에 파일 이름이 있다는 것입니다. 그리고 시스템이 이를 감지합니다.

 

여러분, 요청이 있습니다.

윈도우가 아닌 API를 포함한 모든 API에서 memcpy/strcpy를 사용할 수 없는 API 함수를 찾아야 합니다.

즉, 어떤 이유로 반환 된 포인터의 크기를 알 수 없거나 반환 된 문자열이 NULL로 끝나지 않고 크기를 알 수없는 경우를 찾습니다.


이 메서드의 적용 한계를 찾도록 도와주세요...

 

MT5 642 Win7 64는 내가 이해하는 한 작동하지 않습니다.

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // 메모리 객체 생성

1400 오류가 발생합니다,

하지만 비스타 32는 작동합니다.

 

확인했지만 동일한 오류가 발생했습니다. 하지만 =6입니다.

 
sergeev:

확인했지만 동일한 오류가 발생했습니다. 하지만 =6입니다.



어떤 종류의 트릭이 틀림 없습니다. 직접 실행하면 오류 = 6이 발생하지만 디버그 모드에서는 오류 = 1400이 발생합니다.

 
int 또는 이중 배열을 전송하는 방법은 무엇인가요? 나는 그것을 할 수 없다 :(
 
baramantan:
int 또는 이중 배열을 전송하는 방법은 무엇인가요? 나는 그것을 할 수 없다 :(
sizeof(<Type>)*<Number_Elements>의 긴 변수로 취급하면 모든 것이 작동합니다 :)