我有一个日志记录工具(SS_Log 的后代),它由一个独立的日志查看器和一个 C++ 库组成,用于通过命名管道发送消息。
当记录第一条消息时,客户端通过 C++ lib 启动日志查看器,并执行
HANDLE hPipe = CreateNamedPipe( szPipeName,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE|PIPE_WAIT|PIPE_READMODE_MESSAGE,
PIPE_UNLIMITED_INSTANCES,
SSLOG_MAX_MESSAGE_LENGTH,
0, 5000, &sa );
pView->Pipe(hPipe);
if( pView->Pipe() == INVALID_HANDLE_VALUE )
{
pView->MessageBox( _T("Could not create the pipe for incoming messages. No messages can be received. "),
_T("Fatal Error"), MB_OK|MB_ICONSTOP );
return FALSE;
}
// now we loop forever, waiting for messages. As they come in, send them
// to the SS_Log_WindowView::EraseLog() and SS_Log_WindowView::WriteLog()
// functions as appropriate.
while( TRUE )
{
ConnectNamedPipe( pView->Pipe(), NULL );
...
}
当客户端想要发送消息时,它确实
BOOL bResult = WaitNamedPipe(WindowPipeName(), 20000);
bResult = CallNamedPipe(WindowPipeName(), (LPVOID)szFinalBuffer,
_tcslen(szFinalBuffer)+1, (LPVOID)NULL,
0, &dwBytesRead,
5000);
我想获得一个与这个命名管道相对应的 HANDLE。文档建议我可以使用CreateFile( WindowPipeName(), GENERIC_READ|GENERIC_WRITE,...OPEN_EXISTING,...)
. 当我这样做时,某些东西显然开始阻塞,并且日志查看器不再收到任何消息。甚至没有对那个 HANDLE 做任何事情。
是否可以做我想做的事,如果可以,怎么做?