안녕하세요.
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);