Я пытаюсь переписать xCmd, который может запустить процесс на удаленной машине. В основном он устанавливает себя как услугу на целевом компьютере, а затем запускает запрошенный процесс. Все работает нормально, но я заметил ошибку. xCmd обменивается данными по трубам и использует WriteFile(). Моя проблема заключается в том, что если я запустил свой API (или изначально, оба произвел эту ошибку), то в первый раз он запустит запрошенный процесс, но если я запустил его еще раз, то он «замерзнет» на эта линия:Функция WriteFile «зависает»
WriteFile(hCommandPipe, &msg, sizeof(msg), &dwTemp, NULL);
WriteFile
не возвращает никакого ERRORCODE, программа просто останавливается здесь. Я даже не могу закрыть 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
@kampi Я думаю, что проблема находится на другом конце трубы. Можете ли вы добавить код, в котором вы вызываете 'ReadFile' на трубе? например, либо вы не читаете все данные с первого запроса, либо трубу сломаны во время первого запроса. Также вы используете именованные или анонимные каналы? Вы просмотрели примеры программ? http: // msdn. microsoft.com/en-us/library/aa365799%28VS.85%29.aspx –
@ Поверните, что вы правы! Проблема была на другом конце трубы. Проблема была в функции CreateProcess. Для параметра bInheritHandles paramater установлено значение TRUE, и это вызвало проблему. Я установил его в FALSE, и теперь он работает нормально. Я не думал, что это может быть проблемой. Спасибо за вашу помощь! – kampi