Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[12935] [질문]메모리 맵핑시 MapViewOfFile이 nil이 들어오는 현상. [ 수정 ]
이길남.HoPe [miru0418] 1980 읽음    2009-10-13 17:44
안녕하세요.
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);

+ -

관련 글 리스트
12935 [질문]메모리 맵핑시 MapViewOfFile이 nil이 들어오는 현상. [ 수정 ] 이길남.HoPe 1980 2009/10/13
12938     Re:[자답]메모리 맵핑시 MapViewOfFile이 nil이 들어오는 현상. [ 수정 ] 이길남.HoPe 3057 2009/10/15
12936     Re:[질문]메모리 맵핑시 MapViewOfFile이 nil이 들어오는 현상. civilian 2021 2009/10/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.