2009-11-19 2 views
0

Я пытаюсь переписать 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

ответ

4

Я думаю, что означает, что другой конец соединения труб не считывает данные из трубы, а буфер для труб заполнен.

Он также может указывать на то, что другой конец закрыл их ручка трубы. Для анонимных труб, которые могут вызвать ошибку при попытке записи, но я не помню, верно ли это также и для именованных каналов.

Если буфер трубы заполнен, когда приложение использует функцию WriteFile для записи в трубу, операция записи может не завершиться немедленно. Операция записи будет завершена, когда операция чтения (с использованием функции ReadFile) сделает больше свободного пространства для буфера системы для этого канала.

MSDN

Операция записи будет блокировать, пока данные не считываются из трубы, так что дополнительный буфер квоты может быть освобожден.

MSDN

+0

Спасибо, за ответ, но я до сих пор не понимает :(Почему это работает для первого запуска, и почему она замерзает во второй раз? Я думаю, что я должен 0 из буфер или переменная, но я не знаю, какой из них :( – kampi

+0

@kampi Я думаю, что проблема находится на другом конце трубы. Можете ли вы добавить код, в котором вы вызываете 'ReadFile' на трубе? например, либо вы не читаете все данные с первого запроса, либо трубу сломаны во время первого запроса. Также вы используете именованные или анонимные каналы? Вы просмотрели примеры программ? http: // msdn. microsoft.com/en-us/library/aa365799%28VS.85%29.aspx –

+0

@ Поверните, что вы правы! Проблема была на другом конце трубы. Проблема была в функции CreateProcess. Для параметра bInheritHandles paramater установлено значение TRUE, и это вызвало проблему. Я установил его в FALSE, и теперь он работает нормально. Я не думал, что это может быть проблемой. Спасибо за вашу помощь! – kampi

Смежные вопросы