Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Новый участник


Сообщения: 29
Благодарности: 13

Профиль | Отправить PM | Цитировать


Цитата Serega:
Цитата South:
я предложил использовать hProcess, который не будет освобожден, пока не вызван CloseHandle »
Согласен, но сразу забыл сказать, что PI.hProcess, не знаю почему, но именно в Inno показывает не верное значение, может где-то, что я не так сделал…
Это можно увидеть, если добавить сообщение в функцию _StartProc, пример:
Код:
ProcessName:= ExtractFileName(Filename);
ProcessId:= PI.dwProcessId;
MsgBox('Запущена программа: ' + ProcessName + #13#10 +
'PI.hProcess: ' + IntToStr(PI.hProcess) + #13#10 +
'_OpenProcess: ' + IntToStr(_OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId)),
mbInformation, MB_OK);
_CloseHandle(PI.hProcess);
_CloseHandle(PI.hThread);
у меня в инно с PI.hProcess проблем не было
по поводу приведенного куска
hProcess:THandle, THandle=Longword
Код: Выделить весь код
Longint	        -2147483648..2147483647	signed 32-bit
Longword 	0..4294967295	                unsigned 32-bit
в инно - function IntToStr(i: Longint): String;
выводы по поводу IntToStr(PI.hProcess) должны быть очевидны

Цитата:
Цитата South:
в общем случае да, будет мертвым, а если его использовать как я предложил, то должен ожить »
теоретически да, но я не пробовал, врать не буду.
я вообще-то тоже не пробовал и полной уверенности, что это сработает нет, надо пробовать

Цитата:
Цитата South:
а про таймер, ваша религия позволила вам использовать системные библиотеки, так почему же не использовать SetTimer и KillTimer »
Причём тут религия? Попробуйте, в стандартной версии SetTimer и у вас вылетит ошибка. Цель написания скрипта была, чтоб с ним можно было работать в разных версиях Inno и не тащить с собой в инсталляторе дополнительные библиотеки.
А так понятно, можно было написать отдельную dll'ку и всего это скрипта не надо, но этих dll'ок и так уже куча...
я в своих скриптах никогда не использовал версии от ResTools (если это имелось ввиду), только только стандартный инно, даже препроцессор никогда не использовал. и SetTimer у меня всегда работал. только вот ему нужна innocallback.dll, тут я не подумал, каюсь

ЗЫ все-таки для данной задачи в такой постановке достаточно WaitForSingleObjects. если интересно можно посмотреть на руборде в шапке скрипт ExecAppAndMoveWindow.iss. давненько делал, тоже была задача без привлечения внешних длл запустить приложение и переместить его окно и тоже для распаковки внешних архивов . там и hProcess, и WaitForSingleObjects используется, а общий подход примерно такой же

ЗЗЫ тут глянул, в TStartupInfo 3 поля являются указателями, ты же их обзываешь Longint'ом, который может принимать отрицательные значения, при этом не инициализируешь все поля, хотя это нужно делать.
попробуй эти три поля объявить как Longword, обнули все поля которые не заполняешь конкретными значениями (обычно вызывают FillChar(TStartupInfo , SizeOf(TStartupInfo ), 0)). после этого вызывай CreateProcess, тогда возможно Longword нормально приведется к Pointer и в ответ нормально заполнится TProcessInformation

Последний раз редактировалось South, 22-01-2010 в 00:23.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:32, 21-01-2010 | #897