2009-11-19 67 views
0

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

WriteFile(hCommandPipe, &msg, sizeof(msg), &dwTemp, NULL); 

WriteFile没有返回任何错误代码,程序只是到此为止。我甚至无法关闭cmd窗口。我只能关闭这个,当我关闭目标计算机的服务。 任何人都可以帮我解决这个问题吗?这真是烦人,我不知道:(

这里是一个不能正常工作的功能:

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

回答

4

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

它也可能表明另一端已关闭它们管子手柄。对于尝试写入时会导致错误的匿名管道,但我不记得命名管道是否也是如此。

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

MSDN

写入操作将阻塞,直到数据被从管道中读取,以使附加的缓冲配额可以被释放。

MSDN

+0

谢谢您的回复,但我还是不明白:(为什么它第一次运行工作,为什么它冻结第二次?我觉得我应该出来0一个缓冲区或一个变量,但我不知道哪一个:( – kampi 2009-11-24 20:23:53

+0

@ kampi我认为问题是在管道的另一端,你可以添加代码,你在管道上调用'ReadFile'吗?它看起来像比如你没有读取第一个请求中的所有数据,或者管道在第一次请求期间被破坏了,另外,你使用的是命名管道还是匿名管道?你看过示例程序吗?http:// msdn。 microsoft.com/en-us/library/aa365799%28VS.85%29.aspx – 2009-11-24 21:35:14

+0

@Tim你是对的!问题出在管道的另一端。问题出在CreateProcess函数上。它的bInheritHandles参数设置为TRUE,导致了问题。我将它设置为FALSE,现在它工作正常。我没有想到这可能是问题所在。谢谢你的帮助! – kampi 2009-11-24 21:57:03