 メールスロットを利用する比較的簡単にプロセス間通信を
行うことができます。
メールスロットを利用する比較的簡単にプロセス間通信を
行うことができます。SDK編ではすでに、第250章で解説しています。 サーバープロセスでメールスロットを作成して、メッセージが送られてくるのを待ちます。 クライアントプロセスで、メッセージを送信します。
今回は、サーバー側を作成します。
メールスロットを作成するには、CreateMailslot関数を使います。
HANDLE CreateMailslot( LPCTSTR lpName, DWORD nMaxMessageSize, DWORD lReadTimeout, LPSECURITY_ATTRIBUTES lpSecurityAttributes );lpNameには、メールスロットの名前を指定します。
\\.\mailslot\名前「名前」の部分に自分の好きな名前を指定します。 C言語では「\」の文字は「\\」で表しますので、実際にプログラム中では
\\\\.\\mailslot\\名前の形になるので注意してください。 この名前の付け方で、他のコンピュータとも通信が可能になります。 nMaxMessageSizeには、受け取ることのできる最大メッセージのサイズを指定します。 0なら制限なしです。 lReadTimeoutには、メッセージ読み取りまでのミリセコンドを指定します。 MAILSLOT_WAIT_FOREVERを指定すると、メッセージが送られてくるまで待ちます。
lpSecurityAttributes には、SECURITY_ATTRIBUTES 構造体へのポインタを指定します。 子供にハンドルを継承するかどうかです。その必要がなければNULLにしておきます。
ハンドルがクローズされると、メールスロットは破棄されます。 もしくは、メールスロットを作成したプロセスが終了しても破棄されます。
メッセージを読み出すには、GetMailslotInfo関数でメールスロット情報を取得します。
BOOL GetMailslotInfo( HANDLE hMailslot, LPDWORD lpMaxMessageSize, LPDWORD lpNextSize, LPDWORD lpMessageCount, LPDWORD lpReadTimeout );hMailslotには、メールスロットのハンドルを指定します。
lpMaxMessageSizeには、受け取ることのできる最大のメッセージサイズを格納するバッファのポインタを指定します。不要ならNULLを指定することもできます。<> lpNextSizeには次のメッセージのサイズを格納するバッファのポインタを指定します。 MAILSLOT_NO_MESSAGEが格納されたら次のメッセージはないことを表します。 不要ならNULLを指定します。
lpMessageCountには、読まれるのを待っているメッセージの数を格納するバッファへのポインタを指定します。不要ならNULLを指定します。
lpReadTimeoutにはタイムアウト時間を格納するバッファへのポインタを指定します。これも不要ならNULLを指定します。
関数が成功したら0以外、失敗したら0を返します。
次のメッセージがあることがわかったら、ReadFile関数で読み出します。
では、プログラムを見てみましょう。
/* mailslot01.c */
#include <windows.h>
#include <stdio.h>
int GetMail(HANDLE); 
int main()
{
    HANDLE hMail;
    char szMailSlot[] ="\\\\.\\mailslot\\mymail", szNo[8];
    int nNo;
    BOOL bEnd = FALSE;
     hMail = CreateMailslot(
               szMailSlot, 0, MAILSLOT_WAIT_FOREVER, NULL);
     if (hMail == INVALID_HANDLE_VALUE) {
         printf("メールスロット作成失敗\n");
         return -1;
     }
     while (1) {
         printf("***** Menu *****\n");
         printf("1: 読み取り\n");
         printf("0: 終了\n");
         printf("****************\n");
         printf("選択--->");
         gets(szNo);
         nNo = atoi(szNo);
         switch (nNo) {
             case 1: GetMail(hMail);
                 break;
             case 0:
                 bEnd = TRUE;
                 break;
             default:
                 printf("不正な番号です\n");
                 continue;
         }
         if (bEnd)
             break;
     }
     CloseHandle(hMail);
     return 0;
}
int GetMail(HANDLE hHandle)
{
    BOOL bResult;
    DWORD dwNextSize, dwCount, dwRead;
    char szBuf[1024];
    
    bResult = GetMailslotInfo(hHandle, 0, &dwNextSize, &dwCount, NULL);
    
    if (bResult == FALSE) {
        printf("情報取得ができません\n");
        return -1;
    }
    if (dwNextSize == MAILSLOT_NO_MESSAGE) {
        printf("メッセージはありません\n");
        return -2;
    }
    ReadFile(hHandle, szBuf, dwNextSize, &dwRead, NULL);
    printf("メッセージです----------\n");
    printf(szBuf);
    printf("-------------------------\n");
    return 0;
}
このプログラムを実行して「読み取り」を選択しても、「メッセージはありません」
としか返答しません。次回は、メッセージ送信側のプログラムを作ります。
Update Aug/21/2005 By Y.Kumei