首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WriteFile函数“冻结”

WriteFile函数“冻结”
EN

Stack Overflow用户
提问于 2009-11-20 07:58:13
回答 2查看 4.3K关注 0票数 2

我正在尝试重写xCmd,它可以在远程机器上启动一个进程。基本上,它将自己作为服务安装在目标计算机上,然后启动所请求的进程。一切正常,但我注意到一个错误。xCmd通过管道进行通信,它使用WriteFile()。我的问题是,如果我运行我的API (或最初,两者都产生这个错误),那么它将第一次启动请求的进程,但如果我再次启动它,那么它将在下面这一行“冻结”:

代码语言:javascript
复制
WriteFile( hCommandPipe, &msg, sizeof(msg), &dwTemp, NULL );

WriteFile没有返回任何错误代码,程序只是停在这里。我甚至不能关闭命令窗口。只有当我在目标计算机上关闭服务时,我才能关闭此服务。有人能帮我解决这个问题吗?这真的很烦人,我也不知道:

下面是不能正常工作的函数:

代码语言:javascript
复制
 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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-20 08:16:35

我认为这意味着管道连接的另一端没有从管道中读取数据,管道缓冲区已满。

这也可能表示另一端已关闭其管道手柄。对于匿名管道,这会在您尝试编写时导致错误,但我不记得命名管道是否也是如此。

如果应用程序使用WriteFile函数写入管道时管道缓冲区已满,则写入操作可能无法立即完成。当读操作(使用ReadFile函数)为管道提供了更多的系统缓冲区空间时,写操作将完成。

MSDN

写操作将一直阻塞,直到从管道读取数据,以便可以释放额外的缓冲区配额。

MSDN

票数 5
EN

Stack Overflow用户

发布于 2021-05-21 21:49:08

在多线程管道服务器中,管道客户端可以在调用CreateNamedPipe和ConnectNamedPipe函数之间的时间间隔内成功连接到管道实例。如果发生这种情况,ConnectNamedPipe将返回0,而GetLastError将返回ERROR_PIPE_CONNECTED。

因此,您需要使用以下代码来判断连接是否成功。

代码语言:javascript
复制
BOOL fConnected = ConnectNamedPipe(hPipe, NULL) ? 
         TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); 

参考:https://docs.microsoft.com/en-us/windows/win32/ipc/multithreaded-pipe-server

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1767479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档