DLL을 사용하여 프로세스 간 데이터 공유

1802 단어 뒤죽박죽이다
마크 했다가 또 까먹을까봐.
Dll 코드:
#include "stdafx.h"
#include 

int globalint = 0;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	printf("globalint = %d 
",globalint); globalint = 5; return TRUE; }

DLL에서 글로벌 변수를 정의했습니다.다음은 테스트 코드로 이런 방식으로 공유를 실현할 수 있는지 시험해 봅시다.
테스트 코드:
#include "stdafx.h"
#include 
#include 
#include 

int main(int argc, char* argv[])
{
	HANDLE m_hDll;
	m_hDll=LoadLibraryA(".\\ShareDLL");
	getchar();
	return 0;
}

각각 두 프로세스로load 이 dll을 가져옵니다.데이터 공유가 가능하다면.그러면 첫 번째 출력은 글로벌 int = 0.두 번째 출력은 글로벌int=5.
확인:
이것은 두 개의 커다란 0이다.전체 국면의 변수를 이용한 사상을 공유하는 것은 통하지 않는다는 것을 설명한다.
왜 실패했는지에 대해.Copy On Write (윈도우즈를 쓸 때 복제하는 메커니즘) 가 작용하는 것 같습니다.
말하자면 크로스 프로세스가 데이터를 공유할 때다.만약 어떤 사람이 일단 데이터를 쓴다면 시스템은 자신의 프로세스 공간에 복사본을 복사할 것이다.
DLL로 말하자면, 그 안의 코드와 데이터는 모두 프로세스들이 공유하는 것이다. 만약 어떤 프로세스가 DLL의 데이터를 수정하려고 한다면.
쓰기 시 복제 메커니즘을 사용하여 메모리 페이지를 재분할합니다.새로 분리된 페이지로 데이터를 복사합니다.
사전 컴파일 매크로 #pragma 사용 공유 세그먼트 추가, COW 종료
DLL 코드:
#include "stdafx.h"
#include 
#pragma data_seg("ShareSec")
int globalint = 0;// globalint  ShareSec 
#pragma data_seg()
#pragma comment(linker,"/SECTION:ShareSec,RWS")//      ShareSec          

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	printf("globalint = %d 
",globalint); globalint = 5; return TRUE; }

peid를 사용하여 새로 만든 세그먼트를 보려면 다음과 같이 하십시오.
이미 생성되었으니 테스트 코드로 결과를 보십시오:

좋은 웹페이지 즐겨찾기