Чтобы испытать, как программировать с API Win32, я записал программу, которая создает процесс. Затем я хочу проверить, ожидает ли мой процесс недавно созданного процесса, закройте дескриптор и затем проверьте WaitForSingleObject снова (второй процесс спит для 700 мс),
Первый процесс:
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
void main()
{
bool ret;
bool retwait;
STARTUPINFO startupinfo;
GetStartupInfo (&startupinfo);
PROCESS_INFORMATION pro2info;
wchar_t wcsCommandLine[] = L"D:\\betriebssystemePRA1PRO2.exe";
ret = CreateProcess(NULL, wcsCommandLine, NULL, NULL, false, CREATE_NEW_CONSOLE, NULL,
NULL, &startupinfo, &pro2info);
cout<<"hProcess: "<<pro2info.hProcess<<endl;
cout<<"dwProcessId: "<<pro2info.dwProcessId <<endl;
if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==true)
cout<<"waitprocess:true"<<endl; //The process is finished
else
cout<<"waitprocess:false"<<endl;
CloseHandle (pro2info.hProcess);//prozesshandle schließen, "verliert connection"
if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==true) //When the process has finished
cout<<"waitprocess:true"<<endl;
else
cout<<"waitprocess:false"<<endl;
//cout<<GetLastError()<<endl; //Output the last error.
ExitProcess(0);
}
Второй процесс:
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
void main()
{
int b;
b = GetCurrentProcessId();
cout << b << endl;
cout << "Druecken Sie Enter zum Beenden" << endl;
cin.get();
//Wait until the user confirms
Sleep (700);
ExitProcess(0);
cout<<"test";
}
Первый процесс печатает ложь, ложь; но это должно распечатать верный, ложный.
Вместо, если еще оператор, я использовал это:
//switch(WaitForSingleObject (pro2info.hProcess, INFINITE)){
// case WAIT_OBJECT_0: cout << "ja";
// break;
// case WAIT_FAILED:cout << "nein";
// break;
// case WAIT_TIMEOUT:
// break;
//}
// cout<<"waitprocess:true"<<endl;//prozess ist fertig
//else
// cout<<"waitprocess:false"<<endl;
И это, кажется, работает. Что я делал неправильно с моим if-else
оператор?
Вам действительно нужно обратить внимание на значение возвращаемого значения функций API. Вы не можете игнорировать ЛОЖНЫЙ возврат от CreateProcess (). WaitForSingleObject () может возвращать несколько значений, он возвращает 0, если ожидание завершилось успешно. Что заставляет вас печатать «ложь».
Согласно MSDN, WaitForSingleObject вернет WAIT_OBJECT_0, если ожидание не было прервано. Если вы посмотрите документацию, то значение WAIT_OBJECT_0 окажется 0x00000000L, которое обычно преобразуется в false
, а не в true
. Следовательно, ваше сравнение не работает.
Преобразование возвращаемого значения WaitForSingleObject
в bool
- IMHO не очень хорошая идея, учитывая, что вы получаете несколько потенциально интересных ненулевых кодов возврата, которые показывают, почему ожидание истекло.
Если вы все еще хотите сохранить приведенный выше код как использующий булеву проверку, измените тесты на !WaitForSingleObject(...)
вместо.
Думаю, вы сами ответили на свой вопрос. Дело в том, что WaitForSingleObject
возвращает не true
или false
, а WAIT_OBJECT_0
и т.д.
Так что вместо
if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==true)
нужно
if (retwait= WaitForSingleObject (pro2info.hProcess, INFINITE)==WAIT_OBJECT_0)