반응형

다음과 같이 선언 되어 있다고 가정한다

어떤 .h 파일에서...

class NineTile{
public :

static CRect mTileRect;

static void SetTileRectSize( CRect TileSize ){
mTileRect = TileSize; 
}
}




main.cpp 가 아닌 어느 cpp 파일에서 Ninetile 의 static 함수로 접근하여 멤버변수 static CRect mTileRect;

에 접근하려고 하면  NineTile.cpp 에 static CRect NineTile::mTileRect; 의 멤버 초기화를 쓰면 안되는 경우가

발생한다..,  다른 프로젝트에서 만들어진 Dll 파일을 다른 cpp 에서 읽어들여 사용 하는 경우.

호출은 아래에서와 같이 main 이 아닌 어느 cpp

CRect tempTileRect = CRect(0,0, pMapLayerData->miTileWidth,pMapLayerData->miTileHeight );
NineTile::SetTileRectSize(tempTileRect );





어떤 cpp 파일에서 static 함수를 호출 한 후 nineTile 의 static 멤버에 접근하려면

어느 cpp 위에 CRect NineTile::mTileRect;  의 static 변수 선언 문이 있어야 에러가 나지 않는다...


dll 에서 읽어 온것인지라 static 변수 선언을 양쪽에서 해줘야 하나 ????
 

 
 
 
프로세스간 static 변수 공유
 
dll은 기본적으로 코드 공유를 위한 목적으로 사용됩니다.
즉, dll에서 사용되는 데이터 값은 dll을 사용하는 애플리케이션 간에 공유되지 않죠.

예를 들어, dll 안에 static int g_nCount = 0; 라는 값이 있을 때, 
dll에서 export하는 Increase라는 함수를 호출하면 g_nCount++; 라는 구문이 실행되고, g_nCount 값을 리턴한다고 가정하죠.

이 때, 서로 다른 2개의 애플리케이션(즉, 프로세스)에서 
이 dll을 로딩하고 Increase를 호출하면 g_nCount 값은
각각의 프로세스에서 증가되고 모두 1이 리턴됩니다.

즉, 처음에 말한 바와 같이 dll 내에서 static으로 선언한다고 해서
이 변수가 dll을 사용하는 프로세스 간에 공유되지는 않습니다.
그러나 변수 값을 공유하는 방법이 있습니다.

pragma directive를 사용하면 되는데
공유하고자 하는 변수를 

#pragma data_seg(".ioshare")
static int g_nCount = 0;
#pragma data_seg()

위와 같이 data_seg pragma directive 안에 넣어줍니다.
이 때 .ioshare 라는 문자열은
dll 내에 어떤 데이터 영역으로 표시되는지를 결정합니다.
지정하지 않으면 기본적으로 .data 영역에 들어가게 되죠.
(Windows PE 포맷의 기본 데이터 영역입니다.)

프로세스간 데이터 공유에 대해서는 다양한 IPC 방법이 있지만
dll을 사용해서 이렇게도 할 수 있다는 것을 기억하면 좋겠죠. ^^




반응형

+ Recent posts