자세한 답변 감사드립니다.
예제를 열심히 분석해 봐야 겠네요. 감사합니다.
빌더(TWx) 님이 쓰신 글 :
: 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로 빌드한 테스트 프로젝트 같이 첨부하니까 확인해 보세요.
:
:
:
:
:
: ...
|