createfilemapping 예제

정적 LPVOID lpvMem = NULL; 공유 메모리에 대한 포인터 예를 들어 명명된 공유 메모리 만들기 또는 큰 페이지를 사용하여 파일 매핑 만들기를 참조하십시오. 다음 예제에서는 DLL 진입점 함수가 파일 매핑 개체를 사용하여 DLL을 로드하는 프로세스에서 공유할 수 있는 메모리를 설정하는 방법을 보여 줍니다. 공유 DLL 메모리는 DLL이 로드된 동안에만 유지됩니다. 응용 프로그램은 SetSharedMem() 및 GetSharedMem() 함수를 사용하여 공유 메모리에 액세스할 수 있습니다. 이 특성은 실행 가능한 이미지 파일 또는 데이터 파일(hfile 매개 변수는 파일에 대한 핸들)에 의해 뒷받침되는 파일 매핑 개체에는 영향을 주지 않습니다. 공유 메모리는 각 프로세스의 다른 주소에 매핑할 수 있습니다. 이러한 이유로 각 프로세스에는 모든 DLL 함수에서 사용할 수 있도록 전역 변수로 선언되는 lpvMem의 자체 인스턴스가 있습니다. 이 예제에서는 DLL 전역 데이터가 공유되지 않는다고 가정하므로 DLL을 로드하는 각 프로세스에는 자체 lpvMem 인스턴스가 있습니다. 파일 매핑 개체에 대한 마지막 핸들이 닫힐 때 공유 메모리가 해제됩니다. 영구 공유 메모리를 만들려면 일부 프로세스에 항상 파일 매핑 개체에 대한 열린 핸들이 있는지 확인해야 합니다.

해결 방법: 문제에 대해 CreateFileMapping을 사용할 수 있습니다. 참조 문서: http://msdn.microsoft.com/en-us/library/aa366537(v=vs.85).aspx // 공유 메모리에서 호출자의 버퍼로 복사 . 연결된 코드에서 C++ DLL(SharedMem.DLL)은 맵 (사전/해시테이블)을 모방하여 프로세스 간에 사용할 수 있습니다. 데이터 공유는 MMF를 기반으로 합니다. CreateFileMapping에 대한 기본 자습서는 여기를 참조하십시오. 이 샘플은 SetData/GetData 패턴에서 공유 메모리를 맵과 같은 사용 방법의 샘플입니다. 파일 매핑 개체의 최대 크기는 GetLargePageMinimum 함수에서 반환되는 큰 페이지의 최소 크기의 배수여야 합니다. 그렇지 않으면 CreateFile매핑이 실패합니다. SEC_LARGE_PAGES로 만든 파일 매핑 개체의 뷰를 매핑할 때 기본 주소와 뷰 크기도 최소 큰 페이지 크기의 배수여야 합니다. 그런 다음 프로세스는 CreateFileMapping이 MapViewOfFile 호출에서 반환하는 파일 매핑 개체 핸들을 사용하여 프로세스 주소 공간에서 파일보기를 만듭니다.

MapViewOfFile 함수는 파일 뷰p에 대한 포인터를 반환합니다. 그런 다음 프로세스는 CopyMemory 함수를 사용하여 다른 프로세스에서 액세스할 수 있는 뷰에 문자열을 작성합니다. SEC_LARGE_PAGES가 지정된 경우 SEC_COMMIT도 지정해야 합니다. 프로세스 초기화 또는 LoadLibrary로 인해 DLL 로드 데이터를 공유하려면 여러 프로세스가 시스템 페이징 파일이 저장하는 메모리 매핑 파일을 사용할 수 있습니다. CreateFileMapping()의 lpAttributes 매개 변수에 대한 NULL 값을 전달하여 기본 보안 특성을 지정할 수 있지만 SECURITY_ATTRIBUTES 구조를 사용하여 추가 보안을 제공할 수 있습니다. 코드와 샘플에서는 VB.NET, C#및 C++에서 이 공유 메모리를 사용하는 방법을 설명합니다. 프로젝트를 빌드하고 실행합니다. 생성된 DLL은 다음 스크린샷과 같이 사용할 준비가 되었습니다. 정적 핸들 hMapObject = NULL; 파일 매핑에 대한 핸들 .

두 번째 프로세스는 첫 번째 프로세스로 매핑 개체에 대해 동일한 이름을 지정하는 OpenFileMapping 함수를 호출하여 첫 번째 프로세스에서 공유 메모리에 기록된 문자열에 액세스할 수 있습니다.

0saves
If you enjoyed this post, please consider leaving a comment or subscribing to the RSS feed to have future articles delivered to your feed reader.

Comments are closed.