ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [펌] 프로세스간 메모리(데이터) 공유방법 (data seg)
    카테고리 없음 2007. 12. 18. 10:24

    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

Designed by Tistory.