본문 바로가기

프로그래밍

[Visual C++]data_seg pragma를 이용하여 DLL과 데이터(메모리) 공유하기



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


출처 : http://www.dukgun.com