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를 사용하여 새로 만든 세그먼트를 보려면 다음과 같이 하십시오.
이미 생성되었으니 테스트 코드로 결과를 보십시오:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
질문#include #include #include using namespace std; int main(void){ //物品种类 int n=5; //背包可装重量 int c=10; //每一种物品重量 int w[5]={2...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.