2017-11-03 9 views
1

私は起動時に起動するサービスを持っており、起動フォルダに配置したアプリケーションがあります。サービスとアプリケーション間の名前付きパイプ通信

クライアントは、名前付きパイプのサーバーに非常に遅く接続することがあります。

私のサービスのコードです。

hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\popupPipe"), 
        PIPE_ACCESS_DUPLEX | PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists... 
        PIPE_WAIT, 
        1, 1024 * 16, 1024 * 16, 
        NMPWAIT_USE_DEFAULT_WAIT, 
        NULL); 

HRESULT 
SendMessage(){ 
    if (ConnectNamedPipe(hPipe, NULL) != FALSE) { // wait for someone to connect to the pipe 
     WriteFile(hPipe, (char *)message->buffer, sizeof(message->buffer), &dwWritten, NULL); 
     return S_OK; 
    } 
    return E_FAIL; 
} 

、ここでアプリケーション

hPipe = CreateFile(TEXT("\\\\.\\pipe\\popupPipe"), 
        GENERIC_READ | GENERIC_WRITE, 
        0, 
        NULL, 
        OPEN_EXISTING, 
        0, 
        NULL); 

if (hPipe == INVALID_HANDLE_VALUE) 
    return -1; 

while (hPipe != INVALID_HANDLE_VALUE) 
{ 
    DWORD dwRead; 
    char buffer[100] = { 0 }; 
    while (ReadFile(hPipe, buffer, sizeof(buffer), &dwRead, NULL) != FALSE); 
    if (dwRead == sizeof(buffer)) { 
     dwRead = 0; 
     buffer[100] = '\0'; 
     temp = &buffer[1]; 
     DisplayPopup(hInstance, cmdShow); 
    } 
} 
return 0; 

ますが、クライアントでアプリケーションを終了し、常にサービスSendMessageINVALID_HANDLE_VALUE

を返し、それを最初の回失敗してもそう複数回呼び出されますクライアントが接続していないと成功するはずです。

答えて

3

パイプの作成が成功したかどうかはチェックしません。あなたはパラメータを混ぜるため、Microsoftのドキュメントを見ると、それはおそらく成功しない:

hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\popupPipe"), 
       PIPE_ACCESS_DUPLEX | PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists... 
       PIPE_WAIT, 
       1, 1024 * 16, 1024 * 16, 
       NMPWAIT_USE_DEFAULT_WAIT, 
       NULL); 

は次のようになります。

hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\popupPipe"), 
       PIPE_ACCESS_DUPLEX, 
       PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists... 
       1, 1024 * 16, 1024 * 16, 
       NMPWAIT_USE_DEFAULT_WAIT, 
       NULL); 
+0

、もう一つだけ質問をいただき、ありがとうございます。クライアントが後で接続することは重要ですか? – qwn

+0

パイプが存在しない場合は、クライアントが接続できないと思います。パイプアフターオールはありません。だから、クライアントは後で接続する必要があります。 –

+0

最初に起動するアプリケーションは 'CreateNamedPipe'を実行し、' CreateFile'を接続するクライアントは正しいでしょうか? – qwn

関連する問題