さて、今回は前章の続きで、親プロセスで書き込まれた内容を
表示する子プロセス側を作ります。
/* pipe01child.c */
#include <stdio.h>
#include <conio.h>
#include <windows.h>
DWORD WINAPI MyThreadProc(LPVOID);
HANDLE hRead, hThread;
DWORD dwThreadID;
int main()
{
    hRead = GetStdHandle(STD_INPUT_HANDLE);
    if (hRead == INVALID_HANDLE_VALUE) {
        MessageBox(NULL, "GetStdHandle Error", "OK", MB_OK);
        return -1;
    } else {
        hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThreadProc,
            NULL, 0, &dwThreadID);
        if (!hThread) {
            MessageBox(NULL, "CreateThread Error", "OK", MB_OK);
            return -2;
        }
    }
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    return 0;
}
DWORD WINAPI MyThreadProc(LPVOID lpParam)
{
    DWORD dwResult;
    BOOL bSuccess;
    char szBuf[256];
    MessageBox(NULL, "スレッドが作られました", "OK", MB_OK);
    while (1) {
        bSuccess = ReadFile(hRead, szBuf, sizeof(szBuf), &dwResult, NULL);
        if (!bSuccess) {
            break;
        }
        if (strcmp(szBuf, "end") == 0)
            break;
        MessageBox(NULL, szBuf, "OK", MB_OK);
        Sleep(100);
    }
    MessageBox(NULL, "スレッドを抜けます", "OK", MB_OK);
    return 0;
}
ここで、作ったプログラムを前章で作ったpipe01.exeと同じディレクトリに置きます。
そして、pipe01.exeを起動します。すると「スレッドが作られました」という、メッセージボックスが出現します。 そして、コンソールウィンドウにはメニューが表示されます。
このメニューの「1.パイプに書き込む」を選択します。
そして、適当な文字列を書き込みます。
すると、その文字列がメッセージボックスで表示されます。
メニューの0を選択すると、「スレッドを抜けます」というメッセージボックスが出現します。そして、プログラムが終了します。
コンソールアプリケーションなのに、メッセージボックスを使うのは少し反則ですが、 これは、ちょっと仕方のないことです。(メッセージボックスを使わないとどうなるか 実験してみてください。)
Update Feb/12/2006 By Y.Kumei