![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: 1 Всего: 2 |
Привет.
Запускаю int res = (int)ShellExecute(NULL, NULL, "REGSVR32.EXE", path, NULL, SW_SHOWNORMAL); Допустим что DLL-ки нет по такому пути. Выскакивает ShowMessage о том, что невозможно загрузить библиотеку, но res = 42, как будто ShellExecute отработал нормально. Как обработатать эту ошибку? |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
ИМХО никак. Функция то ведь действительно отработала нормально. Всё запустила что нужно. А вот REGSVR32.EXE не нашла dll'ку указанную в параметрах, а следовательно она и генерирует ошибку. Единственное, может попробовать создавать процесс через CreateProcess. А после его отработки получать код завершения:
обычно, при успешном завершении возвращается 0. Если вернулось STILL_ACTIVE - процесс ещё работает. Подробности - GetExitCodeProcess. Это сообщение отредактировал(а) artsb - 28.1.2010, 12:59 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
||||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
А если он повиснет по каким-нибудь причинам, то прога тоже повиснет. Поэтому лучше в цикле ждать небольшой промежуток времени раз пять:
Что типа этого. Только время нужно своё подобрать. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
artsb, так запускай ожидание в отдельном потоке, и пусть себе виснет.
полюбому такие вещи должны быть развязаны с пользовательским интрефейсом если запускаемый процесс повис - юзер это заметит, и например убьет повисший процесс, тогда ожидание закончится или можно предусмотреть в нашей программе кнопку [убить процесс] Добавлено через 1 минуту и 25 секунд а ждать четыре раза по 1 сек в цикле - это бред) |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
не все такие умные а вот и нет. Зависит от задачи. Это я просто пример привёл. А устраивать ожидание до бесконечности (даже в отдельном потоке) нужно лишь в том случае, если есть 100-процентная уверенность, что процесс рано или поздно завершится. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
чтобы особенно ничего не менять, можно использовать ShellExecuteEx
дескриптор процесса тут: SHELLEXECUTEINFO::hProcess если надо скрыть окна запускаемого процесса, можно попробовать передать в ShellExecute дескриптор какого-нить своего скрытого окна или вообще поиграться с SHELLEXECUTEINFO::DUMMYUNIONNAME::hMonitor -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: 1 Всего: 2 |
thx all.
|
|||
|
||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: 1 Всего: 2 |
Как сделать так, чтобы выскакивал ShowMessage об успешной регистрации dll-ки,
ползаю по описание функции, но не нахожу параметра.
|
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
его и нет Схематически:
Добавлено через 2 минуты и 43 секунды Но повторюсь, что обычно при успехе возвращается 0, но не всегда так бывает. Это сообщение отредактировал(а) artsb - 28.1.2010, 13:05 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Если нужен ИМЕННО regsvr32, то проще его не запускать, а выполнить его работу самому. Он делает тривиальную вещь - грузит указанный dll, извлекает из него адрес функции DllRegisterServer (кажется так) и запускает ее. 5 строчек кода |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
а нахрена самому вызывать regsvr32, если тоже что он делает можно сделать руками самому, вызвав экспортируемые функции?
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: 1 Всего: 2 |
У меня почему то info.hProcess = 0 ?
|
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
Что-то мой хрустальный шар барахлит.
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: 1 Всего: 2 |
Отрабатывает всё нормально. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |