これだけでは、あまり意味のないプログラムです。
これは、次のステップに行くまでの、中間段階のプログラムです。
/* 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