我正在尝试重写xCmd,它可以在远程机器上启动一个进程。基本上,它将自己作为服务安装在目标计算机上,然后启动所请求的进程。一切正常,但我注意到一个错误。xCmd通过管道进行通信,它使用WriteFile()。我的问题是,如果我运行我的API (或最初,两者都产生这个错误),那么它将第一次启动请求的进程,但如果我再次启动它,那么它将在下面这一行“冻结”:
WriteFile( hCommandPipe, &msg, sizeof(msg), &dwTemp, NULL );WriteFile没有返回任何错误代码,程序只是停在这里。我甚至不能关闭命令窗口。只有当我在目标计算机上关闭服务时,我才能关闭此服务。有人能帮我解决这个问题吗?这真的很烦人,我也不知道:
下面是不能正常工作的函数:
BOOL ExecuteRemoteCommand()
{
DWORD dwTemp = 0;
xCmdMessage msg;
xCmdResponse response;
::ZeroMemory( &msg, sizeof(msg) );
::ZeroMemory( &response, sizeof(response) );
FillMessage( &msg );
// Send message to service
WriteFile( hCommandPipe, &msg, sizeof(msg), &dwTemp, NULL );
// Connects to remote pipes (stdout, stdin, stderr)
if ( ConnectToRemotePipes( 5, 1000 ) )
{
StdOutput( _T("Ok\n\n") );
// Waiting for response from service
ReadFile( hCommandPipe, &response, sizeof(response), &dwTemp, NULL );
}
else
StdOutput( _T("Failed\n\n") );
if ( response.dwErrorCode == 0 )
_tprintf( _T("\nRemote command returned %d(0x%X)\n"),
response.dwReturnCode,
response.dwReturnCode );
else
_tprintf( _T("\nRemote command failed to start. Returned error code is %d(0x%X)\n"),
response.dwErrorCode,
response.dwErrorCode );
return TRUE;
}提前感谢!
kampi
发布于 2009-11-20 08:16:35
我认为这意味着管道连接的另一端没有从管道中读取数据,管道缓冲区已满。
这也可能表示另一端已关闭其管道手柄。对于匿名管道,这会在您尝试编写时导致错误,但我不记得命名管道是否也是如此。
如果应用程序使用
WriteFile函数写入管道时管道缓冲区已满,则写入操作可能无法立即完成。当读操作(使用ReadFile函数)为管道提供了更多的系统缓冲区空间时,写操作将完成。
MSDN
写操作将一直阻塞,直到从管道读取数据,以便可以释放额外的缓冲区配额。
MSDN
发布于 2021-05-21 21:49:08
在多线程管道服务器中,管道客户端可以在调用CreateNamedPipe和ConnectNamedPipe函数之间的时间间隔内成功连接到管道实例。如果发生这种情况,ConnectNamedPipe将返回0,而GetLastError将返回ERROR_PIPE_CONNECTED。
因此,您需要使用以下代码来判断连接是否成功。
BOOL fConnected = ConnectNamedPipe(hPipe, NULL) ?
TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); 参考:https://docs.microsoft.com/en-us/windows/win32/ipc/multithreaded-pipe-server
https://stackoverflow.com/questions/1767479
复制相似问题