DLL을 Application(EXE)이나 다른 DLL과 연동하여 사용할 때~
DLL 내부에서 생성한 데이터(메모리)를 외부 프로세스에서 공유해야 될 필요가 생길 수도 있다.
DLL과 데이터를 공유하기 위해서는 2가지 방법이 있다.
1. data_seg pragma를 사용하여 공유할 섹션 만들기
2. 메모리 맵 파일 (memory mapped files)을 사용하기
1번째 방법을 사용해 봤는데, 간단해서 사용하기 쉽다.
1. 우선은 공유할 데이터(변수)를 Global 변수로 선언하고 #pragma data_seg를 다음과 같이 추가하기
#pragma data_seg("SHAREDATA")
int g_nCount = 0;
char g_szText[12] = "hello world";
#pragma data_seg()
2-1. 그런 다음에, DLL 프로젝트 내부에서 ***.def 파일에 아래의 내용을 추가한다.
SECTIONS
SHAREDATA READ WRITE SHARED
2-2. ***.def에 위의 내용을 추가하는 대신에 처음 입력한 소스 밑에 아래의 소스를 써도 된다.
#pragma comment( linker, "/SECTION:.SHAREDATA, RWS" ) // R:Read, W:Write, S:Shared
이젠 g_nCount와 g_szText데이터를 DLL 외부에서 사용할 수 있게 된다.
외부에서 변수를 접근하는 것은 여러 방법이 있겠지만, 하나를 예로 들면
아래와 같이 변수의 포인터를 리턴하는 함수를 DLL에 만들어도 된다.
// Global로 선언된 변수(공유 데이터)를 리턴해줄 함수 만들기
__declspec(dllexport) int* GetCountPointer() // 물론, 외부에서 호출할 때는 __declspec(dllimport)
{
return &g_nCount;
}
__declspec(dllexport) char* GetTextPointer() // 물론, 외부에서 호출할 때는 __declspec(dllimport)
{
return g_szText;
}
물론, new로 생성한 변수들도 공유가 가능하다.
메모리 해제(delete)는 DLL 내부에서 해도 되고, DLL 외부에서 해도 된다.
참고자료
MSDN How do I share data in my DLL with an application or with other DLLs?
http://msdn2.microsoft.com/en-us/library/h90dkhs0.aspx
'프로그래밍' 카테고리의 다른 글
[MFC]CWebBrowser2(웹브라우저 컨트롤)에서 POST 방식으로 데이터 넘기기 소스 (0) | 2006.04.04 |
---|---|
(MFC 6.0) CInternetSession::SetCookie의 첫번째 파라미터때문에 발생했던 버그 (1) | 2006.01.16 |
Microsoft 프로그래밍 언어 4종 비교 분석 (1) | 2005.01.20 |
[프로그래밍]C 언어도 진화한다「C99」 (0) | 2004.09.22 |
64비트 시스템으로 본「OS 패러다임의 변화」 (378) | 2004.04.13 |