DLL 공유 세그먼트
// , Instance
#pragma data_seg("SHARED")
static HHOOK hhk=NULL; //
static HINSTANCE hinst=NULL; // dll (hook.dll)
#pragma data_seg()
#pragma comment(linker, "/section:SHARED,rws")
// !
1.#pragma data_seg ()는 일반적으로 DLL에서 사용됩니다.DLL에서 공유된 이름이 있는 데이터 세그먼트를 정의하는 것이다.가장 중요한 것은 이 데이터 세그먼트의 전역 변수는 여러 프로세스에 공유될 수 있다는 것이다.그렇지 않으면 여러 프로세스 간에 DLL의 글로벌 변수를 공유할 수 없습니다.2. 공유 데이터는 반드시 초기화해야 한다. 그렇지 않으면 마이크로소프트 컴파일러는 초기화되지 않은 데이터를 shared에 넣지 않고 일반적인 초기화되지 않은 데이터 세그먼트에 놓아서 여러 프로세스 간의 공유 행위가 실패할 것이다.첫 번째 #pragma 서술은 데이터 세그먼트를 만듭니다. 여기는shared라고 합니다.이 단락을 원하는 이름으로 명명할 수 있습니다.여기 있는 #pragma 서술 이후의 모든 초기화된 변수는shared 데이터 섹션에 있습니다.두 번째 #pragma는 데이터 세그먼트의 끝을 설명합니다.연결기는'shared'공유 데이터 세그먼트가 있다는 것을 알아야 한다.#pragma comment(linker, "/SECTION:shared, RWS")//자모 RWS는 세그먼트에 읽기, 쓰기, 공유 속성이 있음을 나타냅니다.
소개:
http://baike.baidu.com/link?url=PK_XeHTkADDTAT8dsYWxHOxIBerKW9dbL5a0xPEcMWbuuNjQ57ZqZT95-i5uMqj3SKL30O4Uea5cJFohadc6aq는 Win16 환경에서 DLL의 전역 데이터는 불러오는 프로세스마다 동일합니다.Win32 환경에서는 DLL 함수에서 코드가 만든 모든 대상 (변수 포함) 은 호출된 루트나 프로세스에 귀속됩니다.프로세스가 DLL을 불러올 때, 운영체제는 자동으로 DLL 주소를 프로세스의 개인 공간, 즉 프로세스의 가상 주소 공간에 비추고, 이 DLL의 전역 데이터의 한 부를 프로세스 공간으로 복사합니다.즉, 모든 프로세스가 가지고 있는 같은 DLL의 전역 데이터는 이름은 같지만 그 값이 반드시 같을 뿐만 아니라 서로 간섭하지 않는다는 것이다.따라서 Win32 환경에서 여러 프로세스에서 데이터를 공유하려면 필요한 설정이 필요합니다.같은 Dll에 액세스하는 각 프로세스 간에 공유 메모리는 메모리 매핑 파일 기술을 통해 이루어진다.공유해야 할 데이터를 분리하여 하나의 독립된 데이터 섹션에 놓고 이 섹션의 속성을 공유로 설정할 수도 있다.이러한 변수에 초기 값을 지정해야 합니다. 그렇지 않으면 컴파일러가 초기 값을 지정하지 않은 변수를 초기화되지 않은 데이터 세그먼트에 배치합니다. #pragma data_seg 사전 처리 명령은 다음과 같은 공유 데이터 세그먼트를 설정하는 데 사용됩니다. 예를 들어, #pragma dataseg("SharedDataName") HHOOK hHook=NULL; #pragma data_seg () #pragma comment(linker, "/section:. Shared DataName, rws") 설명:
#pragma data_seg("SharedDataName") 및 #pragma dataseg() 사이의 모든 변수는 Dll에 액세스하는 모든 프로세스에서 보고 공유됩니다. #pragma comment (linker, "/section:. Shared DataName, rws") 는 이 데이터 섹션의 데이터를 모든 DLL의 실례 사이에서 공유할 수 있도록 설정합니다.모든 이 데이터에 대한 작업은 프로세스의 주소 공간에 있는 것이 아니라 같은 실례를 겨냥한 것이다.프로세스가 동적 라이브러리의 함수를 은밀하거나 현저하게 호출할 때 시스템은 이 동적 라이브러리를 프로세스의 가상 주소 공간에 비추어야 한다. (이하 '주소 공간' 이라고 약칭한다.)이것은 DLL을 프로세스의 일부로 만들고 이 프로세스의 창고를 사용합니다.
다음은 공유 데이터를 사용하여 애플리케이션이 시작된 횟수를 통계하고 해당하는 처리를 하는 실제 애플리케이션입니다.
// :
//
#pragma data_seg("flag_data")
int count=0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:flag_data,RWS")
if(count > 1)
{
MessageBox(" ","Warning",MB_OK);
return FLASE;
}
count++;