Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.062 c
15-1158557532
Id
2006-09-18 09:32
2006.10.08
Установочный пакет с FB 1.5


2-1158580517
Id
2006-09-18 15:55
2006.10.08
Картинка в BLOB-e


15-1157940647
boalse
2006-09-11 06:10
2006.10.08
Физики, SOS


15-1158563005
VitV
2006-09-18 11:03
2006.10.08
Название компонента


1-1155795190
konrads
2006-08-17 10:13
2006.10.08
Доступные принтеры