MAX SIZE에 구조체의 사이즈를 넣어야 댔는데, 포인터의 사이즈를 넣어버렸군요....
그럼 즐거운 하루 되십시요. *^^*
FMemoryMap := CreateFileMapping(Dword(-1), nil, PAGE_READWRITE, 0, sizeof(SProcessLogMap), 'Process Log Map - HoPe(V1.0)');
이길남.HoPe 님이 쓰신 글 :
: 안녕하세요.
: C++ Builder를 사용하여 메모리 맵핑 테스트를 완료하였습니다.
: 지금은 델파이로 MapViewOfFile을 사용하여 메모리 맵핑을 하려고 합니다.
:
: 하지만, 동일한 구조체인데 C++에서는 정상적인 주소가 반환이 되고, 델파이에서는 nil이 반환됩니다.
: 혹시 제가 모르는 설정값이 있는지요?
: 여러 고수님들의 고견을 듣겠습니다.
: 수고하십시요.
:
:
: //[델파이 소스]
: // - 구조체
: PProcessLogMap = ^SProcessLogMap;
: SProcessLogMap = record
: FilePath : array [0..1023] of Char;
: ClassName : array [0..255] of Char;
: WindowName : array [0..255] of Char;
:
: Channel : Integer;
: StringIndex : Integer;
: AStringCount : Integer;
: BStringCount : Integer;
: AStringList : array [0..999, 0..511] of Char;
: BStringList : array [0..999, 0..511] of Char;
:
: SpLive : Integer; //Spy Live
: WaLive : Integer; //Watcher Live
: SpCommand : array [0..255] of Char; //Spy Command
: WaCommand : array [0..255] of Char; //Watcher Command
: end;
:
: // - 메모리 잡는 부분
: procedure CProcessMap.CreateMapping;
: var
: m_Len : Integer;
: m_Size : Integer;
: m_Exist : Boolean;
: begin
: FMemoryMap := CreateFileMapping(Dword(-1), nil, PAGE_READWRITE, 0, sizeof(PProcessLogMap), 'Process Log Map - HoPe(V1.0)');
:
: m_Exist := False;
: if GetLastError = ERROR_ALREADY_EXISTS then
: begin
: FMemoryMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'Process Log Map - HoPe(V1.0)');
: m_Exist := True;
: end;
: if FMemoryMap = 0 then Exit;
:
: FProcessLogMap := PProcessLogMap(MapViewOfFile(FMemoryMap, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(SProcessLogMap)));
: if FProcessLogMap = nil then
: begin
: CloseHandle(FMemoryMap);
: FMemoryMap := 0;
: Exit;
: end;
:
: if m_Exist = False then
: begin
: ZeroMemory(@FProcessLogMap.FilePath[0], SizeOf(Char) * 1024);
: ZeroMemory(@FProcessLogMap.ClassName[0], SizeOf(Char) * 256);
: ZeroMemory(@FProcessLogMap.WindowName[0], SizeOf(Char) * 256);
:
: FProcessLogMap.WaLive := 0;
: FProcessLogMap.Channel := 0;
: FProcessLogMap.StringIndex := 0;
: FProcessLogMap.AStringCount := 0;
: FProcessLogMap.BStringCount := 0;
:
: ZeroMemory(@FProcessLogMap.WaCommand[0], SizeOf(Char) * 256);
: ZeroMemory(@FProcessLogMap.AStringList[0, 0], SizeOf(Char) * 1000 * 512);
: ZeroMemory(@FProcessLogMap.BStringList[0, 0], SizeOf(Char) * 1000 * 512);
: end;
: FProcessLogMap.SpLive := 1;
: ZeroMemory(@FProcessLogMap.SpCommand[0], SizeOf(Char) * 256);
:
: m_Len := Length(FilePath);
: if m_Len > 1024 then m_Len := 1024;
: CopyMemory(@FProcessLogMap.FilePath[0], @FilePath[1], m_Len);
:
: m_Len := Length(FAppClassName);
: if m_Len > 256 then m_Len := 256;
: CopyMemory(@FProcessLogMap.ClassName[0], @FAppClassName[1], m_Len);
:
: m_Len := Length(FAppWindowName);
: if m_Len > 256 then m_Len := 256;
: CopyMemory(@FProcessLogMap.WindowName[0], @FAppWindowName[1], m_Len);
: end;
:
:
:
: //[C++ 빌더 소스]
: // - 구조체
: typedef struct {
: char FilePath[1024];
: char ClassName[256];
: char WindowName[256];
:
: int Channel;
: int StringIndex;
: int AStringCount;
: int BStringCount;
: char AStringList[1000][512];
: char BStringList[1000][512];
:
: int SpLive; //Spy Live
: int WaLive; //Watcher Live
: char SpCommand[256]; //Spy Command
: char WaCommand[256]; //Watcher Command
:
: } SProcessLogMap;
:
: // - 메모리 잡는 부분
: FMemoryMap = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, sizeof(SProcessLogMap), "Process Log Map - HoPe(V1.0)");
:
: bool fExist = false;
: if(GetLastError() == ERROR_ALREADY_EXISTS)
: {
: FMemoryMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, "Process Log Map - HoPe(V1.0)");
: fExist = true;
: }
: if(FMemoryMap == NULL) return;
:
: FProcessLogMap = (SProcessLogMap *)MapViewOfFile(FMemoryMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(SProcessLogMap));
: if(FProcessLogMap == NULL)
: {
: CloseHandle(FMemoryMap);
: FMemoryMap = NULL;
: return;
: }
:
: if(!fExist)
: {
: memset(FProcessLogMap->FilePath, '\0', sizeof(char) * 1024);
: memset(FProcessLogMap->ClassName, '\0', sizeof(char) * 256);
: memset(FProcessLogMap->WindowName, '\0', sizeof(char) * 256);
:
: FProcessLogMap->WaLive = 0;
: FProcessLogMap->Channel = 0;
: FProcessLogMap->StringIndex = 0;
: FProcessLogMap->AStringCount = 0;
: FProcessLogMap->BStringCount = 0;
:
: memset(FProcessLogMap->WaCommand, '\0', sizeof(char) * 256);
: memset(FProcessLogMap->AStringList, '\0', sizeof(char) * 1000 * 512);
: memset(FProcessLogMap->BStringList, '\0', sizeof(char) * 1000 * 512);
: }
:
: FProcessLogMap->SpLive = 1;
: memset(FProcessLogMap->SpCommand, '\0', sizeof(char) * 256);
:
: memcpy(FProcessLogMap->FilePath, FilePath.c_str(), (FilePath.Length() < 1024) ? FilePath.Length() : 1024);
: memcpy(FProcessLogMap->ClassName, FAppClassName.c_str(), (FAppClassName.Length() < 256) ? FAppClassName.Length() : 256);
: memcpy(FProcessLogMap->WindowName, FAppWindowName.c_str(), (FAppWindowName.Length() < 256) ? FAppWindowName.Length() : 256);
: