티스토리 뷰

Lastupdate 2014. 12. 19 

리눅스에서 하던것처럼  윈도우에서도 서로다른 실행화일 끼리 메모리공유 할 수 있다!

너무 좋지 아니한가! ^^

 

클래스 헤더화일 shareMem.h

#ifndef _shareMemH
#define _shareMemH
//---------------------------------------------------------------------------
#include <CLASSES.HPP> 	//추가
typedef struct TMemoryMappedData{
	//계측데이터
	float fDAT[20][100];

}TSharedData;

class shareMem {

public:

	//===================================================
	HANDLE MapHandle;
	char *MMFileName;
	//===================================================
	TSharedData *SharedData;
	void __fastcall shareMem::fn_Create(void);
	void __fastcall shareMem::fn_Open(void);
	void __fastcall shareMem::fn_Close(void);


	__fastcall shareMem::shareMem(void);

};
#endif

클래스 소스화일 shareMem.cpp

/*
################################################################################
모듈이름	공유메모리 모듈
작성일자	2013. 09.17
작성자명	황 규 석 (HwangKyuseok)

참조싸이트	http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=20016
################################################################################
*/
//---------------------------------------------------------------------------
#include <VCL.H>	//컴포넌트 사용하기위해 추가
#pragma hdrstop

#include "_shareMem.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//------------------------------------------------------------------------------
// 생성자 함수
//------------------------------------------------------------------------------
__fastcall shareMem::shareMem(void)
{
	MMFileName = "MEMORY_MAPPED_MORTALPAIN";
	SharedData = NULL;
	MapHandle = NULL;
}
//------------------------------------------------------------------------------
// 메모리맵 생성
//------------------------------------------------------------------------------
void __fastcall shareMem::fn_Create(void)
{
	int size = sizeof(TSharedData);

	if(MapHandle == NULL)
		MapHandle = CreateFileMapping( (HANDLE) 0xFFFFFFFF,	//공유할 IO맵 핸들
										NULL,               //보안속성
										PAGE_READWRITE,		//사용할 맵파일 속성
										0,					//자료의 상위사이즈
										size,				//자료의 하위사이즈
										MMFileName);		//맵파일의 고유 이름
	else {
		ShowMessage("이미 파일 맵핑이 생성 되었습니다.!");
		return;
	}

	if( MapHandle == NULL ) {
		//ShowMessage("Unable to create file mapping !");
		ShowMessage("파일 맵핑을 만들 수 없습니다!");
		return;
	}

	SharedData = (TSharedData *)MapViewOfFile(MapHandle,			//맵파일 핸들
												FILE_MAP_ALL_ACCESS,//맵파일 속성
												0,
												0,
												size);
	if( SharedData == NULL) {
		CloseHandle(MapHandle);
		//ShowMessage("Unable to map view of file. err:" + GetLastError());
		ShowMessage("맵핑된 파일을 볼수가 없습니다. 에러:" + GetLastError());
	}
}
//------------------------------------------------------------------------------
// 메모리맵 열기
//------------------------------------------------------------------------------
void __fastcall shareMem::fn_Open(void)
{
	int size = sizeof(TSharedData);
	MapHandle = OpenFileMapping(FILE_MAP_ALL_ACCESS,false,MMFileName);
	if(MapHandle == NULL) {
		//ShowMessage("Unable to Open file mapping !");
		ShowMessage("파일 맵핑을 볼 수 가없습니다. !");
		return;
	}

	SharedData = (TSharedData *)MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS,0,0,size);

	if(SharedData == NULL) {
		CloseHandle(MapHandle);
		//ShowMessage("Unable to map view of file. Error:" + GetLastError());
		ShowMessage("맵핑된 파일을 볼수가 없습니다. 에러:" + GetLastError());
	}
}
//------------------------------------------------------------------------------
// 메모리맵 닫기
//------------------------------------------------------------------------------
void __fastcall shareMem::fn_Close(void)
{
	UnmapViewOfFile(SharedData);
	CloseHandle(MapHandle);
	SharedData = NULL;
	MapHandle = NULL;
}

사용예)

//공유메모리 할당
shareMem *sm = new shareMem;
 
//공유메모리 생성
sm->fn_Create();
 
//공유메모리 오픈
sm->fn_Open();
 
//공유메모리 접근
sm->fDET[0][] = 3.2;
 
//공유메모리 닫기
sm->fn_Close();