NeoDreamer 님이 쓰신 글 :
: 하나의 프로세스가 있는데 이 프로세스에 모듈로(어떤 형식으로든) 붙는 녀석이 메인 프로세서의 메모리 영역에 있는 데이터를 자유자재로 접근하여 사용할 수 있는 방법(기술)이 있을까요?
프로세스 바운드리 간에 데이터 공유라면 "Shared Section"을 이용해서 처리하면 되겠지만...
질문의 요지로 봐서는 메인 프로세스에서 정의 되어있는 데이타를 In-Process 형태로 프로세스의 어드레스 공간에 매핑되는
DLL 모듈에서 사용하고자 함으로 보이는데요...
Exe 모듈에서도 어떤 데이타에 대해서 Export Section에 엔트리를 생성할 수 있다는 것을 알고 있다면 문제는 쉽게 해결 됩니다.
메인 Exe 프로세스 모듈에서... 다음과 같은 식으로 데이타 엔트리가 Export Section에 생성되도록 합니다.
...
extern "C" {
__declspec(dllexport) char *SomeDataFromExe = "Some Data From Exe Process...";
}
...
extern "C"로 지정했으므로 컴파일러가 _SomeDataFromExe 라는 엔트리를 실행파일의 Export Table에 생성하게 되겠죠.
Exe 모듈에서 Export 하고있는 데이타를 DLL 모듈에서 사용하기 위해선 아래와 같은 방법을 쓰면 됩니다.
...
char *SomeDataFromExe = NULL;
extern "C" int _libmain(unsigned long reason)
{
HMODULE hExeModule = GetModuleHandle(NULL);
char **p = (char**)GetProcAddress( hExeModule, "_SomeDataFromExe");
if ( p && reason == DLL_PROCESS_ATTACH ) {
SomeDataFromExe = *p;
MessageBoxA(NULL, SomeDataFromExe, "MessageBox", MB_OK);
}
return 1;
}
...
'GetModuleHandle(NULL)'을 하게 되면 DLL을 로드한 Exe 모듈의 베이스 어드레스가 리턴되고...
Exe 모듈에서 char * 타입으로 데이타를 Export 하고 있으니까 실제적인 주소는 char ** 로 얻어야 하고요...
RAD XE2로 빌드한 테스트 프로젝트 같이 첨부하니까 확인해 보세요.
...
|