Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизЗапуск стороннего exe Найти похожие ветки
← →
VitalikS (2006-08-23 09:32) [0]О программе:
1) Собственно сама программа exe"шник
2) Служба Windows, которая контролирует запущенна ли программа
А вот вопрос:
Если запускаю exe то всё работает нормально, но как только программу запускает служба, то тут начинаются глюки.
В службе как уже только не запусказ exe всё никак не получается использовал: ShellExecute, winexec, CreateProcess, пока сейчас с последним мучаюсь, получается они все запускают приложение как потомок от службы (или я что-то недопонимаю), а нет ли такого способа что-бы программа была запущена как самостоятельное приложение т.е. что-бы функция запустила программу и всё, программа бы знала текущую директорию (это удалось решить использованием последней функции, но всё же есть сомнения) и что-бы SHBrowseForFolder работал (при запуске службой не видит рабочий стол и мои документы, в пути вместо папки user"а ставит LocalService).
Помогите пожалуйста разобраться.
← →
ANB © (2006-08-23 10:14) [1]А служба запущена, есно, не из под юзера, под которым залогинились :)
И под системом она и запускает твою прогу, от чего и прут глюки. Ищи как запустить процесс из под другого юзера.
← →
Ketmar © (2006-08-23 11:23) [2]CreateProcessAsUser(), например.
← →
VitalikS (2006-08-24 02:20) [3]
> CreateProcessAsUser(), например.
>
При использовании в параметре нужно указывать логин и пароль пользователя, а этого бы не хотелось.
Если указываю логин и пароль пользователя в самой службе (средствами windows), то служба программу запускает, но программа видна только в процессах, а в трее иконки нет, хотя должна быть (программа запускается, сворачивается и оставляет след в трее о своём наличии).
← →
Ketmar © (2006-08-24 02:24) [4]> [3] VitalikS (24.08.06 02:20)
и вовсе не должна. кто сказал, что она запустится на том же рабочем столе, за каким юзер?
← →
VitalikS (2006-08-24 02:42) [5]
> и вовсе не должна. кто сказал, что она запустится на том
> же рабочем столе, за каким юзер?
а как ещё, если я запускаю программу под тем юзером под которым зашел в систему. да и процессах "имя пользователя" то под которым зашел.
← →
VitalikS (2006-08-24 04:38) [6]
> CreateProcessAsUser(), например.
Вписываю логин и пароль юзера, программ запускается от его имени и иконка в трее висит, но при отображении окна программы показывается только заголовок окна, без всяких надписей и кнопок просто полоска синяя и всё и так все окна.
← →
Чапаев © (2006-08-24 08:30) [7]> если я запускаю программу под тем юзером под которым зашел
> в систему
Кто сказал? Ты же сам чуть раньше говорил, что программу из службы запускаешь...
← →
VitalikS (2006-08-24 08:46) [8]
> Кто сказал? Ты же сам чуть раньше говорил, что программу
> из службы запускаешь...
Да из службы, но в службе можно прописать от какого юзера запускаться, вот если я в службе средствами windows прописываю юзера то служба и соответственно программа запускаеются от этого пользователя.
Тут ещё вот, что обнаружил, если сначала запустить службу от нужного юзера (как описал выше), а потом в свойствах службы вернуть галку "вход от системноу учетки", то SHBrowseForFolder будет нормально видет рабочий стол и документы.
Почему так, что предпринять? Я уже всё облазил ну нигде ничего толкового не могу найти, а надо, очень надо.
← →
Чапаев © (2006-08-24 09:11) [9]> Да из службы, но в службе можно прописать от какого юзера
> запускаться, вот если я в службе средствами windows прописываю
> юзера то служба и соответственно программа запускаеются
> от этого пользователя.
Бррр...
> Почему так, что предпринять?
Первым делом -- подумать. Зачем такие вот фокусы? Что за задача?
← →
VitalikS (2006-08-24 09:21) [10]Задача такая:
Программа выбирает определенные данные с базы FB.
Всё бы хорошо, но на некоторых машинах (где сидят шибко шустрые операторы!!!) программа вылетает. Вот для этого и написана служба которая запускает приложение повторно через определенный интервал времени.
Вот собственно и вся задача.
← →
Ketmar © (2006-08-24 10:05) [11]> [10] VitalikS (24.08.06 09:21)
ффух. а SetUnhandledExceptionFilter() не помогает?
← →
Чапаев © (2006-08-24 11:02) [12]> на некоторых машинах (где сидят шибко шустрые операторы!
> !!) программа вылетает.
Гм... "Когда у мадам падала выручка, она меняла девочек, а не кровати". Может, стоит глюки в исходной программе искать, а не устранять симптомы, да ещё так извратно?
А служба зачем в принципе? Не проще ли написать обычную прогу, которая по таймеру будет отслеживать что надо, и засунуть её в автозагрузку? Во всяком случае проблема запуска из-под другого пользователя самоликвидируется...
← →
kami © (2006-08-24 13:53) [13]Еще раз, почти дословная цитата.
Для 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;
← →
VitalikS (2006-08-25 00:58) [14]
> а SetUnhandledExceptionFilter() не помогает?
Не знаю что это такое поищу, посмотрю потом отвечу...
> Может, стоит глюки в исходной программе искать,
Синдром "корявых рук оператора" устранить в программе никак нельзя, тем более тот который присутствует у нас.
> А служба зачем в принципе? Не проще ли написать обычную
> прогу, которая по таймеру будет отслеживать что надо, и
> засунуть её в автозагрузку?
Прога и так помещена в автозагрузку и по таймеру отслеживает что её надо, но я же уже писал, что на некоторых машинах вылетает.......для этого и служба, чтобы свести отсутствие программы к минимуму.
kami, я попробую по результатам отпишусь
← →
Ketmar © (2006-08-25 01:30) [15]> [14] VitalikS (25.08.06 00:58)
> Синдром "корявых рук оператора"...
устранять не надо. надо выпрямитель рук для программиста, который позволяет себе не обрабатывать исключения.
← →
VitalikS (2006-08-25 01:51) [16]
> устранять не надо. надо выпрямитель рук для программиста,
> который позволяет себе не обрабатывать исключения.
Нельзя, программа должна работать весь день и не выдавать оператору никаких сообщений об ошибках.
> Еще раз, почти дословная цитата.
> Для 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 02:19) [17]> [16] VitalikS (25.08.06 01:51)
> Нельзя, программа должна работать весь день и не выдавать
> оператору никаких сообщений об ошибках
Вы-таки будете смеяться, но именно для обработки (и последующей возможной невыдачи) "сообщений об ошибках" программисты ловят исключения и проверяют всякие значения на допустимость.
← →
Германн © (2006-08-25 03:01) [18]
> Ketmar © (25.08.06 02:19) [17]
>
> > [16] VitalikS (25.08.06 01:51)
> > Нельзя, программа должна работать весь день и не выдавать
> > оператору никаких сообщений об ошибках
> Вы-таки будете смеяться, но именно для обработки (и последующей
> возможной невыдачи) "сообщений об ошибках" программисты
> ловят исключения и проверяют всякие значения на допустимость.
>
>
Не знаю, что "делают в таких случаях программисты", но если программа должна работать "круглосуточно", то без лога не обойтись!
← →
Ketmar © (2006-08-25 03:10) [19]> [18] Германн © (25.08.06 03:01)
а лог -- он вообще почти всегда полезен. %-)
← →
VitalikS (2006-08-25 06:15) [20]Лог есть.
В логе все нормально, никаких ошибок небыло, но программа куда то исчезла, операторы говорят что никаких ошибок не выдавалось (но этому верить нельзя...).
Ну в принципе на таких компах как у нас вылет программы может произойти без проблем если на некоторых экземплярах файлы теряются, то вылет возможен, а вот служба как раз всё и перезапустит.
← →
kami © (2006-08-25 08:04) [21]
function WTSQueryUserToken(SessionId: DWord;var phToken: THandle): bool; stdcall; external "wtsapi32.dll";
function WTSGetActiveConsoleSessionId: DWord; stdcall; external "kernel32.dll";
> может что-то не правильно
Надо MSDN смотреть, прежде чем объявлять функции.
> Не работают эти функции
Работают прекрасно, уже давно пользуюсь их работоспособностью.
← →
Ketmar © (2006-08-25 09:52) [22]> [20] VitalikS (25.08.06 06:15)
> если на некоторых экземплярах файлы теряются
"в военных условиях значение синуса может достигать четырёх" (ц)
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.056 c