//	共有メモリ管理クラス
//	制限事項として、4GB以上のメモリは確保出来ません。
//	（そんなには使わないと思いますが…）
//	またこのクラスは管理機能（ロック等）用に128byte多く
//	メモリを消費します事を予めご了承願います…
#ifndef __MyuSharedMemory_H__
#define __MyuSharedMemory_H__

#include <windows.h>

//	管理用メモリ構造体
typedef struct
{
	DWORD dwHeaderLength;	//	MYU_SHAREMEM_MANAGE_INFOのサイズ
	int nReserved3;			//	予約

	//	8〜
	DWORD dwSize;			//	メモリのサイズ
	DWORD dwSizeHigh;		//	メモリのサイズHigh（未実装）

	//	16〜
	BOOL bLocked;			//	セマフォ
	BYTE bReserved1[32-12];	//	予約

	//	64〜
	char szSecurity[32];	//	セキュリティ（未実装）
	BYTE bReserved2[63];	//	予約
	char cYenN;				//	わひ（何

	//	全128バイト
}
MYU_SHAREMEM_MANAGE_INFO;
#define MYU_SHAREMEM_MANAGE_MEM_SIZE	(sizeof(MYU_SHAREMEM_MANAGE_INFO))	//	管理用メモリサイズ

#define MYU_SHAREMEM_DEF_LOCK_TIMEOUT	(500)


//	クラス宣言
class CMyuSharedMemory
{
private:
	HANDLE m_hMemory;
	LPVOID m_lpBuf;
	DWORD m_dwSize;
	DWORD m_dwRealBufSize;
	//int m_nLockTimeOutMs;	//	未実装

	BOOL Mapping( DWORD dwDesiredAccess=FILE_MAP_ALL_ACCESS );
	void WriteManageInfo();
	BOOL ReadManageInfo();
	const char* GetMutexName( const char* szSharedMemoryName );
	const char* GetMappingName( const char* szSharedMemoryName );

public:
	CMyuSharedMemory();
	virtual ~CMyuSharedMemory(){ Close(); }

	//	作成。初期化も勝手にしてくれる！！
	//	作成したらそのメモリオープン状態は保持されます。
	BOOL Create( const char* szSharedMemoryName, DWORD dwSize/*, DWORD dwSizeHigh=0*/ );

	//	開く
	BOOL Open( const char* szSharedMemoryName,
		DWORD dwDesiredAccess=FILE_MAP_ALL_ACCESS, BOOL bInheritHandle=FALSE );

	//	閉じる
	void Close();

	//	読み書きメソッド
	BOOL Printf( const char *format, ... );
	void ClearMem(){ ::ZeroMemory( GetBufPtr(), m_dwSize ); }

	//	ロック関連
	BOOL GetLockFlg(){ return ((MYU_SHAREMEM_MANAGE_INFO*)m_lpBuf)->bLocked; }
	void Lock(){ ((MYU_SHAREMEM_MANAGE_INFO*)m_lpBuf)->bLocked = TRUE; }
	void Unlock(){ ((MYU_SHAREMEM_MANAGE_INFO*)m_lpBuf)->bLocked = FALSE; }
	BOOL LockWait();

	//	共有メモリへのポインタ取得
	MYU_SHAREMEM_MANAGE_INFO* GetManageInfoPtr(){ return (MYU_SHAREMEM_MANAGE_INFO*)m_lpBuf; }
	MYU_SHAREMEM_MANAGE_INFO* GetHeaderPtr(){ return (MYU_SHAREMEM_MANAGE_INFO*)m_lpBuf; }
	DWORD GetHeaderSize(){ return GetManageInfoPtr()->dwHeaderLength; }
	LPVOID GetBufPtr(){
		if ( m_lpBuf == NULL )
			return NULL;
		return ((BYTE*)m_lpBuf)+MYU_SHAREMEM_MANAGE_MEM_SIZE;
	}
	char* GetStrPtr(){ return (char*)(GetBufPtr()); }
};

#endif//__MyuSharedMemory_H__