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
[12938] Re:[자답]메모리 맵핑시 MapViewOfFile이 nil이 들어오는 현상. [ 수정 ]
이길남.HoPe [miru0418] 3057 읽음    2009-10-15 09:36
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);
: 

+ -

관련 글 리스트
12935 [질문]메모리 맵핑시 MapViewOfFile이 nil이 들어오는 현상. [ 수정 ] 이길남.HoPe 1981 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.