![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск стороннего exe [D7, WinXP]
VitalikS © (2006-08-23 09:32:00)О программе:
1) Собственно сама программа exe'шник
2) Служба Windows, которая контролирует запущенна ли программа
А вот вопрос:
Если запускаю exe то всё работает нормально, но как только программу запускает служба, то тут начинаются глюки.
В службе как уже только не запусказ exe всё никак не получается использовал: ShellExecute, winexec, CreateProcess, пока сейчас с последним мучаюсь, получается они все запускают приложение как потомок от службы (или я что-то недопонимаю), а нет ли такого способа что-бы программа была запущена как самостоятельное приложение т.е. что-бы функция запустила программу и всё, программа бы знала текущую директорию (это удалось решить использованием последней функции, но всё же есть сомнения) и что-бы SHBrowseForFolder работал (при запуске службой не видит рабочий стол и мои документы, в пути вместо папки user'а ставит LocalService).
Помогите пожалуйста разобраться.
Ketmar (2006-08-25 09:52:00) [1]> [20] VitalikS (25.08.06 06:15)
> если на некоторых экземплярах файлы теряются
"в военных условиях значение синуса может достигать четырёх" (ц)
kami (2006-08-25 08:04:00) [2]
function WTSQueryUserToken(SessionId: DWord; varphToken: THandle): bool; stdcall; external 'wtsapi32.dll';
function WTSGetActiveConsoleSessionId: DWord; stdcall; external 'kernel32.dll';
> может что-то не правильно
Надо MSDN смотреть, прежде чем объявлять функции.
> Не работают эти функции
Работают прекрасно, уже давно пользуюсь их работоспособностью.
VitalikS (2006-08-25 06:15:00) [3]Лог есть.
В логе все нормально, никаких ошибок небыло, но программа куда то исчезла, операторы говорят что никаких ошибок не выдавалось (но этому верить нельзя...).
Ну в принципе на таких компах как у нас вылет программы может произойти без проблем если на некоторых экземплярах файлы теряются, то вылет возможен, а вот служба как раз всё и перезапустит.
Ketmar (2006-08-25 03:10:00) [4]> [18] Германн © (25.08.06 03:01)
а лог -- он вообще почти всегда полезен. %-)
Германн (2006-08-25 03:01:00) [5]
> Ketmar © (25.08.06 02:19) [17]
>
> > [16] VitalikS (25.08.06 01:51)
> > Нельзя, программа должна работать весь день и не выдавать
> > оператору никаких сообщений об ошибках
> Вы-таки будете смеяться, но именно для обработки (и последующей
> возможной невыдачи) "сообщений об ошибках" программисты
> ловят исключения и проверяют всякие значения на допустимость.
>
>
Не знаю, что "делают в таких случаях программисты", но если программа должна работать "круглосуточно", то без лога не обойтись!
Ketmar (2006-08-25 02:19:00) [6]> [16] VitalikS (25.08.06 01:51)
> Нельзя, программа должна работать весь день и не выдавать
> оператору никаких сообщений об ошибках
Вы-таки будете смеяться, но именно для обработки (и последующей возможной невыдачи) "сообщений об ошибках" программисты ловят исключения и проверяют всякие значения на допустимость.
VitalikS (2006-08-25 01:51:00) [7]
> устранять не надо. надо выпрямитель рук для программиста,
> который позволяет себе не обрабатывать исключения.
Нельзя, программа должна работать весь день и не выдавать оператору никаких сообщений об ошибках.
> Еще раз, почти дословная цитата.
> Для XP :
Не работают эти функции. Во первых там переменные объявлены неверно (насколько я понял) их типы. Останавливается всё на:
> if not WTSQueryUserToken(SessionID, H) then Exit;
причём exit не выполняется.
Кстати функции объявлял так:
function TSQueryUserToken(SessionId:pDWord;phToken:pHandle):bool;stdcall;external 'wtsapi32.dll';
function WTSGetActiveConsoleSessionId:pDWORD;stdcall;external 'Kernel32.dll';
может что-то не правильно, но программа на это не ругается т.е. функции видит, но здесь видно что с типами переменны что-то непонятное
Ketmar (2006-08-25 01:30:00) [8]> [14] VitalikS (25.08.06 00:58)
> Синдром "корявых рук оператора"...
устранять не надо. надо выпрямитель рук для программиста, который позволяет себе не обрабатывать исключения.
VitalikS (2006-08-25 00:58:00) [9]
> а SetUnhandledExceptionFilter() не помогает?
Не знаю что это такое поищу, посмотрю потом отвечу...
> Может, стоит глюки в исходной программе искать,
Синдром "корявых рук оператора" устранить в программе никак нельзя, тем более тот который присутствует у нас.
> А служба зачем в принципе? Не проще ли написать обычную
> прогу, которая по таймеру будет отслеживать что надо, и
> засунуть её в автозагрузку?
Прога и так помещена в автозагрузку и по таймеру отслеживает что её надо, но я же уже писал, что на некоторых машинах вылетает.......для этого и служба, чтобы свести отсутствие программы к минимуму.
kami, я попробую по результатам отпишусь
kami (2006-08-24 13:53:00) [10]Еще раз, почти дословная цитата.
Для XP :
Набережных С. © (12.03.05 16:14) [25]
function ExecuteOnSession(SessionID: DWORD; const AppName: string): THandle;
var
H: THandle;
SI: TStartupInfo;
PI: TProcessInformation;
begin
Result:=0;
if not WTSQueryUserToken(SessionID, H) then Exit;
try
FillChar(SI, SizeOf(SI), 0);
SI.cb:=SizeOf(SI);
if CreateProcessAsUser(H, nil, 'Notepad.exe', nil, nil, false,
CREATE_NEW_CONSOLE, nil, nil, SI, PI) then
begin
CloseHandle(PI.hThread);
Result:=PI.hProcess;
end;
finally
CloseHandle(H);
end;
end;
function ExecuteAsIU_XP(const AppName: string): THandle;
var
SessionID: DWORD;
begin
SessionID:=WTSGetActiveConsoleSessionId;
Result:=ExecuteOnSession(SessionID, AppName);
end;
Чапаев (2006-08-24 11:02:00) [11]> на некоторых машинах (где сидят шибко шустрые операторы!
> !!) программа вылетает.
Гм... "Когда у мадам падала выручка, она меняла девочек, а не кровати". Может, стоит глюки в исходной программе искать, а не устранять симптомы, да ещё так извратно?
А служба зачем в принципе? Не проще ли написать обычную прогу, которая по таймеру будет отслеживать что надо, и засунуть её в автозагрузку? Во всяком случае проблема запуска из-под другого пользователя самоликвидируется...
Ketmar (2006-08-24 10:05:00) [12]> [10] VitalikS (24.08.06 09:21)
ффух. а SetUnhandledExceptionFilter() не помогает?
VitalikS (2006-08-24 09:21:00) [13]Задача такая:
Программа выбирает определенные данные с базы FB.
Всё бы хорошо, но на некоторых машинах (где сидят шибко шустрые операторы!!!) программа вылетает. Вот для этого и написана служба которая запускает приложение повторно через определенный интервал времени.
Вот собственно и вся задача.
Чапаев (2006-08-24 09:11:00) [14]> Да из службы, но в службе можно прописать от какого юзера
> запускаться, вот если я в службе средствами windows прописываю
> юзера то служба и соответственно программа запускаеются
> от этого пользователя.
Бррр...
> Почему так, что предпринять?
Первым делом -- подумать. Зачем такие вот фокусы? Что за задача?
VitalikS (2006-08-24 08:46:00) [15]
> Кто сказал? Ты же сам чуть раньше говорил, что программу
> из службы запускаешь...
Да из службы, но в службе можно прописать от какого юзера запускаться, вот если я в службе средствами windows прописываю юзера то служба и соответственно программа запускаеются от этого пользователя.
Тут ещё вот, что обнаружил, если сначала запустить службу от нужного юзера (как описал выше), а потом в свойствах службы вернуть галку "вход от системноу учетки", то SHBrowseForFolder будет нормально видет рабочий стол и документы.
Почему так, что предпринять? Я уже всё облазил ну нигде ничего толкового не могу найти, а надо, очень надо.
Чапаев (2006-08-24 08:30:00) [16]> если я запускаю программу под тем юзером под которым зашел
> в систему
Кто сказал? Ты же сам чуть раньше говорил, что программу из службы запускаешь...
VitalikS (2006-08-24 04:38:00) [17]
> CreateProcessAsUser(), например.
Вписываю логин и пароль юзера, программ запускается от его имени и иконка в трее висит, но при отображении окна программы показывается только заголовок окна, без всяких надписей и кнопок просто полоска синяя и всё и так все окна.
VitalikS (2006-08-24 02:42:00) [18]
> и вовсе не должна. кто сказал, что она запустится на том
> же рабочем столе, за каким юзер?
а как ещё, если я запускаю программу под тем юзером под которым зашел в систему. да и процессах "имя пользователя" то под которым зашел.
Ketmar (2006-08-24 02:24:00) [19]> [3] VitalikS (24.08.06 02:20)
и вовсе не должна. кто сказал, что она запустится на том же рабочем столе, за каким юзер?
VitalikS (2006-08-24 02:20:00) [20]
> CreateProcessAsUser(), например.
>
При использовании в параметре нужно указывать логин и пароль пользователя, а этого бы не хотелось.
Если указываю логин и пароль пользователя в самой службе (средствами windows), то служба программу запускает, но программа видна только в процессах, а в трее иконки нет, хотя должна быть (программа запускается, сворачивается и оставляет след в трее о своём наличии).