Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > WaitForSingleObject


Автор: Madest 13.5.2004, 12:05
У меня почему-то при инсталяции некой программы первый раз проскакивает мимо WaitForSingleObject(), а потом когда ставлю поверх - нормально ждет. Почему?

...
STARTUPINFO si;
si.cb=sizeof(STARTUPINFO);
si.lpReserved=NULL;
si.lpDesktop=NULL;
si.lpTitle=NULL;
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_SHOWNORMAL;
si.cbReserved2=0;
si.lpReserved2=NULL;
static PROCESS_INFORMATION pi;
CreateProcess(NULL,"c:\\1\\setup",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
WaitForSingleObject(pi.hProcess,INFINITE);
MessageBox(NULL,"setup","aga",MB_OK);
...

нее, никогда оказывается не ждет.

Автор: bel_nikita 13.5.2004, 14:08
Попробуй, но не знаю, поможет ли sad.gif
Цитата
static PROCESS_INFORMATION pi;
CreateProcess(NULL,"c:\\1\\setup",NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);
ResumeThread(pi.hTread);
WaitForSingleObject(pi.hProcess,INFINITE);


Автор: Madest 13.5.2004, 14:58
Не помогает =(
Это под XP такое. В 2000-м эта же программа нормально себя вела (не замечал во всяком случае).
А может это от того что MySQL устанавливаю?

Автор: Madest 13.5.2004, 15:17
В общем, при инсталяции именно MySQL, WaitForSingleObject() не ловит этот процесс. Как это сделать?

Автор: AndyY 13.5.2004, 16:33
Инсталлеры часто распаковывают в temp и запускать другой процесс, после чего закрываются.
Так, к примеру, устроен wise.
Нужно внимательно посмотреть в таск менеджере, совпадает ли process id инсталлера с возвращенным в startupinfo (после того как wait завершился)

Автор: Madest 13.5.2004, 16:45
Пытаюсь это так ловить его - не выходит =(

HWND hwnd=GetActiveWindow();
LPDWORD lpId;
GetWindowThreadProcessId(hwnd,lpId);
WaitForSingleObject((HANDLE)lpId,INFINITE);

Хотя сам догадываюсь, что нужно ловить хэндл другого (второго) инсталяционного окна, которое выскакивает после первого. Первое закрывается, а инсталяция еще продолжается.

Автор: Madest 13.5.2004, 17:03
Хотя сам догадываюсь, что нужно ловить хэндл другого (второго) инсталяционного окна, которое выскакивает после первого. Первое закрывается, а инсталяция еще продолжается.

Автор: DenDen 13.5.2004, 19:36
А ты в дебаггере проверял. Он точно не NULL??
А еще попробуй флаг STARTF_FORCEONFEEDBACK--может каким-то образом случиться, что процесс либо к моменту занесения еще не запустился, либо в случае перегруженности машины, в процессе проссто поменялось значение дескриптора. Это не так болезненно для процессора. как может показаться на первый взгляд. У меня уже такое бывало.

Автор: mr.DUDA 14.5.2004, 10:20
Цитата
Пытаюсь это так ловить его - не выходит =(

HWND hwnd=GetActiveWindow();
LPDWORD lpId;
GetWindowThreadProcessId(hwnd,lpId);
WaitForSingleObject((HANDLE)lpId,INFINITE);

Конечно не будет работать - т.к. ID процесса и хэндл процесса разные вещи !!!

Совсем другое дело, если получать потом хэндл процесса по его ID (OpenProcess), либо сделать вот так:
Цитата
CString cmdLine = " -какие то параметры в командной строке";
SHELLEXECUTEINFO sei; memset(&sei, 0, sizeof(SHELLEXECUTEINFO));
sei.cbSize=sizeof(sei);
sei.lpFile=new char [_MAX_PATH];
strcpy((LPSTR)sei.lpFile, (LPCTSTR)("c:\\temp\\program.exe"));
sei.lpDirectory = filePath;
sei.nShow = SW_MINIMIZE;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpParameters = cmdLine;
CWaitCursor cur;
ShellExecuteEx(&sei);
WaitForSingleObject(sei.hProcess, 60000); // ждём 60 секунд



Автор: Madest 14.5.2004, 10:49
Одолел! Нашел последнее окошко и жду пока его закроют.
В общем, вот код кому интересно: как установить MySQL, создать сервис и запустить его. Юзеру остается только ввести пароль root.

Код

STARTUPINFO si;
si.cb=sizeof(STARTUPINFO);
si.lpReserved=NULL;
si.lpDesktop=NULL;
si.lpTitle=NULL;
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_FORCEONFEEDBACK;
si.wShowWindow=SW_SHOWNORMAL;
si.cbReserved2=0;
si.lpReserved2=NULL;
static PROCESS_INFORMATION pi;
LPTSTR st1=new char[80];
st1="c:\\1\\setup";
CreateProcess(NULL,st1,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
HWND hwnd=NULL;
do
{
hwnd=FindWindow(NULL,"Setup complete");
}
while(!hwnd);
while(IsWindow(hwnd));
st2="c:\\mysql\\bin\\mysqld-max-nt --install";
CreateProcess(NULL,st2,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
WaitForSingleObject(pi.hProcess,INFINITE);
SC_HANDLE sch;
sch=OpenSCManager(NULL,NULL,NULL);
SC_HANDLE my=OpenService(sch,"MySql",SC_MANAGER_ALL_ACCESS);
StartService(my,NULL,NULL);
st2="mysql -u root mysql";
CreateProcess(NULL,st2,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
WaitForSingleObject(pi.hProcess,INFINITE);


Цитата

Конечно не будет работать - т.к. ID процесса и хэндл процесса разные вещи !!!


Mr.DUDA, у меня были такие подозрения =) Надо как-нить для общего развития и через SHELLEXECUTEINFO сделать.

Cпасибо всем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)