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

C++빌더 Q&A
C++Builder Programming Q&A
[68227] Re:[Q]프로세스 데이터 공유
빌더(TWx) [builder] 1475 읽음    2012-09-22 19:51
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로 빌드한 테스트 프로젝트 같이 첨부하니까 확인해 보세요.





...

+ -

관련 글 리스트
68206 [Q]프로세스 데이터 공유 NeoDreamer 1278 2012/09/20
68227     Re:[Q]프로세스 데이터 공유 빌더(TWx) 1475 2012/09/22
68233         Re:Re:[Q]프로세스 데이터 공유 NeoDreamer 1394 2012/09/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.