| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > ShellExecute, REGSVR32.EXE |
| Автор: lv151 27.1.2010, 17:35 |
| Привет. Запускаю int res = (int)ShellExecute(NULL, NULL, "REGSVR32.EXE", path, NULL, SW_SHOWNORMAL); Допустим что DLL-ки нет по такому пути. Выскакивает ShowMessage о том, что невозможно загрузить библиотеку, но res = 42, как будто ShellExecute отработал нормально. Как обработатать эту ошибку? |
| Автор: artsb 27.1.2010, 18:06 | ||
ИМХО никак. Функция то ведь действительно отработала нормально. Всё запустила что нужно. А вот REGSVR32.EXE не нашла dll'ку указанную в параметрах, а следовательно она и генерирует ошибку. Единственное, может попробовать создавать процесс через http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx. А после его отработки получать код завершения:
обычно, при успешном завершении возвращается 0. Если вернулось STILL_ACTIVE - процесс ещё работает. Подробности - http://msdn.microsoft.com/en-us/library/ms683189%28VS.85%29.aspx. |
| Автор: GoldFinch 27.1.2010, 18:35 |
надо сразу вызывать WaitForSingleObject(processInformation.hProcess,-1); чтобы подождать его завершения |
| Автор: artsb 27.1.2010, 18:42 | ||
А если он повиснет по каким-нибудь причинам, то прога тоже повиснет. Поэтому лучше в цикле ждать небольшой промежуток времени раз пять:
Что типа этого. Только время нужно своё подобрать. |
| Автор: GoldFinch 27.1.2010, 18:48 |
| artsb, так запускай ожидание в отдельном потоке, и пусть себе виснет. полюбому такие вещи должны быть развязаны с пользовательским интрефейсом если запускаемый процесс повис - юзер это заметит, и например убьет повисший процесс, тогда ожидание закончится или можно предусмотреть в нашей программе кнопку [убить процесс] Добавлено через 1 минуту и 25 секунд а ждать четыре раза по 1 сек в цикле - это бред) |
| Автор: artsb 27.1.2010, 19:08 |
не все такие умные а вот и нет. Зависит от задачи. Это я просто пример привёл. А устраивать ожидание до бесконечности (даже в отдельном потоке) нужно лишь в том случае, если есть 100-процентная уверенность, что процесс рано или поздно завершится. |
| Автор: GremlinProg 27.1.2010, 20:01 |
| чтобы особенно ничего не менять, можно использовать ShellExecuteEx дескриптор процесса тут: SHELLEXECUTEINFO::hProcess если надо скрыть окна запускаемого процесса, можно попробовать передать в ShellExecute дескриптор какого-нить своего скрытого окна или вообще поиграться с SHELLEXECUTEINFO::DUMMYUNIONNAME::hMonitor |
| Автор: lv151 28.1.2010, 11:14 |
| thx all. |
| Автор: lv151 28.1.2010, 12:41 | ||
| Как сделать так, чтобы выскакивал ShowMessage об успешной регистрации dll-ки, ползаю по описание функции, но не нахожу параметра.
|
| Автор: artsb 28.1.2010, 13:04 | ||
его и нет Схематически:
Добавлено через 2 минуты и 43 секунды Но повторюсь, что обычно при успехе возвращается 0, но не всегда так бывает. |
| Автор: xvr 28.1.2010, 14:40 | ||
Если нужен ИМЕННО regsvr32, то проще его не запускать, а выполнить его работу самому. Он делает тривиальную вещь - грузит указанный dll, извлекает из него адрес функции DllRegisterServer (кажется так) и запускает ее. 5 строчек кода |
| Автор: jonie 29.1.2010, 12:40 |
| а нахрена самому вызывать regsvr32, если тоже что он делает можно сделать руками самому, вызвав экспортируемые функции? |
| Автор: lv151 8.2.2010, 11:39 |
| У меня почему то info.hProcess = 0 ? |
| Автор: artsb 8.2.2010, 12:22 |
| Что-то мой хрустальный шар барахлит. |
| Автор: lv151 8.2.2010, 13:16 | ||
Отрабатывает всё нормально. |
| Автор: xvr 8.2.2010, 13:24 | ||
|
| Автор: artsb 8.2.2010, 13:36 |
| А на каком этапе info.hProcess становится = 0? Может она изначально равна 0... |
| Автор: xvr 8.2.2010, 13:48 | ||
Видимо изначально - ТС не поставил необходимый флажок в fMask |
| Автор: artsb 8.2.2010, 13:51 | ||
скорее после выполнения ShellExecuteEx. Флаг должен помочь Добавлено через 1 минуту и 10 секунд
|
| Автор: lv151 8.2.2010, 17:31 |
| Всё дело в маске. Спасибо! |