第124章 名前付きパイプ ちょっと改良版


今回は、前章と前々章をあわせたようなプログラムを作ります。 パイプの名前をユーザーに決めさせます。 一つのプログラム中で、スレッドで待ち受けして、親スレッドで子スレッドに 送信します。



これだけでは、あまり意味のないプログラムです。 これは、次のステップに行くまでの、中間段階のプログラムです。

/* 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;
}

実行結果は予想がつきますね。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update May/02/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。