今回は、前章と前々章をあわせたようなプログラムを作ります。
パイプの名前をユーザーに決めさせます。
一つのプログラム中で、スレッドで待ち受けして、親スレッドで子スレッドに
送信します。
これだけでは、あまり意味のないプログラムです。
これは、次のステップに行くまでの、中間段階のプログラムです。
/* namedps.c */
#define EVENTNAME "Nekodemowakaru"
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <process.h>
DWORD WINAPI MyThreadProc(LPVOID);
HANDLE hEvent, hThread;
int main()
{
DWORD dwThreadID;
static HANDLE hPipe;
char szBuf[256], szPipeName[256];
HANDLE hFile;
DWORD dwWritten;
printf("パイプの名前---");
gets(szBuf);
strcpy(szPipeName, "\\\\.\\pipe\\");
strcat(szPipeName, szBuf);
hPipe = CreateNamedPipe(szPipeName,
PIPE_ACCESS_INBOUND, //オープンモード
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE |
PIPE_WAIT, //パイプモード
1, //パイプに対する最大インスタンス
0,//出力バッファ
1024,//入力バッファ
0,//タイムアウト
NULL);
if (hPipe == INVALID_HANDLE_VALUE) {
printf( "パイプ作成失敗\n");
_getch();
return -1;
} else {
printf("パイプを作成しました\n");
}
hEvent = CreateEvent(NULL, //セキュリティ属性
TRUE, //手動リセット
FALSE, //初期状態
EVENTNAME);//名前
hThread = (HANDLE)_beginthreadex(NULL,
0,
(LPTHREAD_START_ROUTINE)MyThreadProc,
(LPVOID)hPipe,
0,
&dwThreadID);
if (hThread == NULL) {
printf("スレッドの作成に失敗しました\n");
CloseHandle(hPipe);
_getch();
return -2;
} else {
printf("スレッドを作成しました\n");
}
hFile = CreateFile(szPipeName,
GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hFile == INVALID_HANDLE_VALUE) {
printf("パイプをオープンできませんでした\n");
CloseHandle(hFile);
CloseHandle(hThread);
_getch();
return -3;
}
while (1) {
printf("送信文---");
gets(szBuf);
if (strcmp(szBuf, "end") == 0) {
SetEvent(hEvent);
WriteFile(hFile, szBuf, (int)strlen(szBuf), &dwWritten, NULL);
break;
}
SetEvent(hEvent);
WriteFile(hFile, szBuf, (int)strlen(szBuf), &dwWritten, NULL);
}
WaitForSingleObject(hThread, INFINITE);
if (CloseHandle(hThread)) {
printf("スレッドのハンドルをクローズしました\n");
}
if (CloseHandle(hFile)) {
printf("hFileをクローズしました\n");
}
printf("プログラムを終了します\n");
printf("何かキーを打ってください\n");
_getch();
return 0;
}
DWORD WINAPI MyThreadProc(LPVOID lpParam)
{
char szBuf[1024];
HANDLE hPipe;
DWORD dwRead;
BOOL bRead = FALSE;
hPipe = (HANDLE)lpParam;
printf("クライアントを待っています...\n");
while (1) {
WaitForSingleObject(hEvent, INFINITE);
memset(szBuf, '\0', sizeof(szBuf));
bRead = ReadFile(hPipe, szBuf, sizeof(szBuf), &dwRead, NULL);
ResetEvent(hEvent);
if (bRead == FALSE) {
printf("読み出し失敗\n何かキーを打ってください\n");
_getch();
break;
}
MessageBox(NULL, szBuf, "名前付きパイプ", MB_OK);
if (strcmp(szBuf, "end") == 0) {
break;
}
}
printf("ループを抜けました\n");
if (CloseHandle(hPipe)) {
printf("hPipeをクローズしました\n");
}
printf("スレッドを抜けます\n");
return 0;
}
実行結果は予想がつきますね。
Update May/02/2006 By Y.Kumei