以前作った GL のアプリケーションをプロセス間通信で外から操作できるようにしたくなったので、第1歩として名前付きパイプを使ったプロセス間通信の Windows 版小 C++ サンプルを作りましたので載せておきます。
サーバー側のプロセス起動後にクライアント側を起動し、サーバー側で文字列を入力すると、クライアント側に出力されるというサンプルです。
サーバー側のコード
#include <Windows.h>
#include <iostream>
void main()
{
char sendBuffer[256];
HANDLE pipeHandle = CreateNamedPipe(
L"\\\\.\\pipe\\mynamedpipe",
PIPE_ACCESS_OUTBOUND, PIPE_TYPE_MESSAGE,
1,
sizeof(sendBuffer),
sizeof(sendBuffer),
1000, NULL);
if (pipeHandle == INVALID_HANDLE_VALUE)
{
std::cout << "パイプ作成に失敗" << std::endl;
return;
}
std::cout << "クライアント起動待ち.." << std::endl;
ConnectNamedPipe(pipeHandle, NULL);
sendBuffer[0] = '\0';
do
{
std::cout << "送信する文字を入力(Endで終了): ";
// 入力文字列を送信
std::cin >> sendBuffer;
DWORD dwResult;
WriteFile(pipeHandle, sendBuffer, strlen(sendBuffer) + 1, &dwResult, NULL);
} while (strcmp(sendBuffer, "End") != 0);
CloseHandle(pipeHandle);
}
クライアント側のコード
#include <Windows.h>
#include <iostream>
void main()
{
HANDLE pipeHandle = CreateFile(L"\\\\.\\pipe\\mynamedpipe", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (pipeHandle == INVALID_HANDLE_VALUE)
{
std::cout << "パイプ作成に失敗" << std::endl;
return;
}
std::cout << "サーバーから受信開始" << std::endl;
// 文字列受信
char recvBuffer[256]; //受信バッファ
do
{
recvBuffer[0] = '\0';
DWORD recvBuffer;
ReadFile(pipeHandle, recvBuffer, sizeof(recvBuffer), &recvBuffer, NULL);
if (recvBuffer[0] == '\0')
{
continue;
}
recvBuffer[readBytes] = '\0';
std::cout << "受信: " << recvBuffer << std::endl;
} while (strcmp(recvBuffer, "End") != 0);
CloseHandle(pipeHandle);
}
参考
https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa365592(v=vs.85).aspx