Привет. Сделал запуск другой программы с ожиданием ее окончания. Под Windows-2000 все работает, а под Windows ME не ждет окончания запущенной задачи. Прикладываю свой код, подскажите в чем дело.
Заранее спасибо.
SHELLEXECUTEINFO info;
info.cbSize = sizeof(SHELLEXECUTEINFO);
info.hwnd = 0;
info.lpVerb = "open";
info.lpFile = lpCmdLine;
info.lpParameters = NULL;
info.lpDirectory = NULL;
info.fMask = SEE_MASK_NOCLOSEPROCESS;
if(ShellExecuteEx(&info))
{
HANDLE hProc = info.hProcess;
WaitForSingleObject(hProc, INFINITE);
}
Здравствуйте Андрей, Вы писали:
А>Здравствуйте Vodka, Вы писали:
V>>Если lpCmdLine — это программа, то действительно лучше CreateProcess, а если это документ (типа some.doc), то CreateProcess здесь не поможет.
А>Он про программу писал, а не про документ.
В принципе, если самому лазить по реестру, можно и для документа обойтись CreateProcess, но зачем?
Потом, если хэндл, который вернула ShellExecuteEx с флагом SEE_MASK_NOCLOSEPROCESS, нельзя использовать для ожидания завершения процесса, то где гарантия, что можно использовать тот хендл, что вернет CreateProcess?
И вообще, тут что-то не то.
Я сделал маленькую консольную программу:
// cl /MD shell.cpp user32.lib shell32.lib
#include <windows.h>
const char *lpCmdLine="calc.exe";
int main()
{
SHELLEXECUTEINFO info;
info.cbSize = sizeof(SHELLEXECUTEINFO);
info.hwnd = 0;
info.lpVerb = "open";
info.lpFile = lpCmdLine;
info.lpParameters = NULL;
info.lpDirectory = NULL;
info.fMask = SEE_MASK_NOCLOSEPROCESS;
if(ShellExecuteEx(&info))
{
HANDLE hProc = info.hProcess;
WaitForSingleObject(hProc, INFINITE);
MessageBox(0, "Done", "shex succeeded", MB_OK);
}
else MessageBox(0, "oops", "shex failed", MB_OK);
}
Так вот, работает и на 98, и на ME! (чтобы найти машину с этим глюкалом, пришлось на этаж подняться

)
Может, надо обнулять структуру SHELLEXECUTEINFO для гарантии?
Здравствуйте retalik, Вы писали:
R>Так вот, работает и на 98, и на ME! (чтобы найти машину с этим глюкалом, пришлось на этаж подняться
)
R>Может, надо обнулять структуру SHELLEXECUTEINFO для гарантии?
Все может быть, может быть надо еще SEE_MASK_FLAG_DDEWAIT использовать. Вообще, часто мне программирование под Windows напоминает шаманство.