随想録(メモリマッピングによるプロセス通信)


【声明:著作権所有、転載歓迎、商業用途に使用しないでください。 連絡先:[email protected]
    通信プロトコルの開発には、ローカルデバッグの必要性のために、プロセス間の通信を実現する必要があります。windowsシステムでは、プロセス通信の方式が多く、例えば、パイプ通信、メモリマッピング、socket通信、カットボード通信などがあります。しかし、その中で一番いい方法はやはりメモリマッピングの方式だと思います。通信のデータは多くのプロセスで共有されているので、必要な相互反発が必要です。相互反発の関係をうまく処理しさえすれば、メモリマップは私達のために多くのことをすることができます。
     メモリマッピングでは、必要な基本関数は非常に簡単です。(1)ファイルマッピング、すなわち関数CreateFileMappingを作成します。(2)ファイルマップを開くと、関数OpenFileMappingとなります。(3)ファイルマップを閉じます。すなわち関数UnimapView OfFileです。名前はserverとclientが識別する唯一の媒体です。以下は一つの例です。貼ったコードは簡単なサービスとクライアントコードで、少し修正します。ソースコードは「Windows API、関数、インターフェース、プログラミングの実例に精通している」から来ています。著作権声明に注意してください。
    サービスエンドコードは以下の通りです。
#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define BUF_SIZE 256

LPTSTR szName = TEXT("mapObject");
LPTSTR szMsg = TEXT("msg");


void main(int argc, char* argv[])
{
    HANDLE  hMapFile;
	LPTSTR pBuf;
	
	hMapFile = CreateFileMapping(
	    INVALID_HANDLE_VALUE,
		NULL,
		PAGE_READWRITE,
		0,
		BUF_SIZE,
		szName
	);
	
	if(hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
	{
	    return;
	}
	
	pBuf = (LPSTR)MapViewOfFile(hMapFile,
	    FILE_MAP_ALL_ACCESS,
	    0,
	    0,
	    BUF_SIZE);
	
	if(NULL == pBuf)
	{
	    return ;
	}
	
	CopyMemory(pBuf, szMsg, strlen(szMsg));
	getch();
	
	UnmapViewOfFile(pBuf);
	CloseHandle(hMapFile);
}
   
クライアントコードは以下の通りです。
#include <windows.h>
#include <stdio.h>
#include <conio.h>

#pragma comment (lib, "User32.lib")
#define BUF_SIZE 256

LPTSTR szName = TEXT("mapObject");

void main(int argc, char* argv[])
{
    HANDLE  hMapFile;
	LPTSTR pBuf;
	
	hMapFile = OpenFileMapping(
	    FILE_MAP_ALL_ACCESS,
		FALSE,
		szName
	);
	
	if(hMapFile == NULL )
	{
	    return ;
	}
	
	pBuf = (LPSTR)MapViewOfFile(hMapFile,
	    FILE_MAP_ALL_ACCESS,
	    0,
	    0,
	    BUF_SIZE);
	
	if(NULL == pBuf)
	{
	    return ;
	}
	
	printf(pBuf);
	UnmapViewOfFile(pBuf);
	CloseHandle(hMapFile);
}