我试图重写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
谢谢您的回复,但我还是不明白:(为什么它第一次运行工作,为什么它冻结第二次?我觉得我应该出来0一个缓冲区或一个变量,但我不知道哪一个:( – kampi 2009-11-24 20:23:53
@ kampi我认为问题是在管道的另一端,你可以添加代码,你在管道上调用'ReadFile'吗?它看起来像比如你没有读取第一个请求中的所有数据,或者管道在第一次请求期间被破坏了,另外,你使用的是命名管道还是匿名管道?你看过示例程序吗?http:// msdn。 microsoft.com/en-us/library/aa365799%28VS.85%29.aspx – 2009-11-24 21:35:14
@Tim你是对的!问题出在管道的另一端。问题出在CreateProcess函数上。它的bInheritHandles参数设置为TRUE,导致了问题。我将它设置为FALSE,现在它工作正常。我没有想到这可能是问题所在。谢谢你的帮助! – kampi 2009-11-24 21:57:03