#pragma data_seg DLL에서 데이터 공유 응용 프로그램

2483 단어
Win32 환경에서 여러 프로세스에서 데이터를 공유하려면 필요한 설정이 필요합니다.같은 Dll에 액세스하는 각 프로세스 간에 공유 메모리는 메모리 매핑 파일 기술을 통해 이루어진다.공유해야 할 데이터를 분리하여 하나의 독립된 데이터 섹션에 놓고 이 섹션의 속성을 공유로 설정할 수도 있다.이 변수에 초기 값을 부여해야 합니다. 그렇지 않으면 컴파일러가 초기 값을 부여하지 않은 변수를 초기화되지 않은 데이터 세그먼트에 놓을 것입니다.
왜냐하면 (MSDN):
The default segment in the .obj file for initialized variables is .data. Variables initialized to zero are considered uninitialized and are stored in .bss.

Example

// pragma_directive_data_seg.cpp
int h = 1;                     // stored in .data
int i = 0;                     // stored in .bss
#pragma data_seg(".my_data1")
int j = 1;                     // stored in "my_data1"
data_seg with no parameters resets the segment to .data

#pragma data_seg 프리처리 명령은 공유 데이터 세그먼트를 설정하는 데 사용됩니다.예를 들면 다음과 같습니다.
#pragma data_seg("SharedDataName")
HHOOK hHook=NULL;
#pragma data_seg()

#pragma dataseg("SharedDataName") 및 #pragma dataseg () 사이의 모든 변수는 Dll에 액세스하는 모든 프로세스에서 보고 공유됩니다.여기에 명령 #pragma comment(linker, "/section:.Shared DataName, rws")를 더하면 알파벳 RWS는 세그먼트가 읽기, 쓰기, 공유 속성을 가지고 있음을 나타낸다.그러면 이 데이터 섹션의 데이터는 모든 DLL 인스턴스 간에 공유할 수 있습니다.모든 이 데이터에 대한 작업은 프로세스의 주소 공간에 있는 것이 아니라 같은 실례를 겨냥한 것이다.
There are restrictions to consider before using a shared data segment:
· Any variables in a shared data segment must be statically initialized. In the above example,
i is initialized to 0(이전 MSDN의 설명과 모순됨) and a is 32 characters initialized to hello world.
· All shared variables are placed in the compiled DLL in the specified data segment. Very large arrays can result in very large DLLs. This is true of all initialized global variables.
· Never store process-specific information in a shared data segment. Most Win32 data structures or values (such as HANDLEs) are really valid only within the context of a single process.
· Each process gets its own address space. It is very important that pointers are never stored in a variable contained in a shared data segment. A pointer might be perfectly valid in one application but not in another.
· It is possible that the DLL itself could get loaded at a different address in the virtual address spaces of each process. It is not safe to have pointers to functions in the DLL or to other shared variables.

좋은 웹페이지 즐겨찾기