data_seg pragma를 이용한 공유 섹션 DLL [펌 blog.naver.com/sim9108]
프로세서와 상관없이 커널 모드에서 공유 섹션을 이용해서 접근이 가능하다.
1. data_seg pragma를 사용하여 공유할 섹션 만들기
#pragma data_seg("SHAREDATA")
int g_nCount = 0;
char g_szText[12] = "hello world";
#pragma data_seg()
DLL 프로젝트 내부에서 ***.def 파일에는 아래 내용을 적어서 익스포트한다.
익스포트한다는 것은 링커의 고유기능이다.
SECTIONS
SHAREDATA READ WRITE SHARED
또는 코딩에서는 아래와 같은 방법을 통해서 링커단계에서 익스포트를 권장할수 있다.
#pragma comment( linker, "/SECTION:.SHAREDATA, RWS" )
// R:Read, W:Write, S:Shared
이젠 g_nCount와 g_szText데이터를 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