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;
ますが、クライアントでアプリケーションを終了し、常にサービスSendMessage
でINVALID_HANDLE_VALUE
を返し、それを最初の回失敗してもそう複数回呼び出されますクライアントが接続していないと成功するはずです。
、もう一つだけ質問をいただき、ありがとうございます。クライアントが後で接続することは重要ですか? – qwn
パイプが存在しない場合は、クライアントが接続できないと思います。パイプアフターオールはありません。だから、クライアントは後で接続する必要があります。 –
最初に起動するアプリケーションは 'CreateNamedPipe'を実行し、' CreateFile'を接続するクライアントは正しいでしょうか? – qwn