Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Есть какие-то проблемы с запуском программ из сервайса? [WinXP]


Страницы:   1 2

Aleksandr. ©   (2006-01-24 16:55:00) 

Сервисное приложение выполняет ShellExecute(0,nil,'C:\test.exe',nil,nil, SW_ShowNormal), результат 42, то есть, если я правильно понял документацию, выше 32 - функция отработала успешно. Но при этом никакого запуска приложения на самом деле не происходит. Может, из сервайса это надо делать иначе?


Aleksandr.   (2006-01-25 20:08:00) [1]

Вау... я за пиффом!


kami   (2006-01-25 19:10:00) [2]

Дословная цитата :)

Набережных С. ©   (12.03.05 16:14) [25]

Нашел для XP. Ведь разбирался когда-то, и помню же, что совсем просто должно быть, а вот ведь как заклинило, а:( В общем, схема такая:

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;


Проверено на XP Pro SP2.

P.S. Да здравствует Пиво - главная движущая сила IT-индустрии!:)))


Aleksandr.   (2006-01-25 17:40:00) [3]

Спасибо за просвещение, буду двигаться дальше :)


sniknik   (2006-01-25 17:05:00) [4]

> То есть каждое сообщение было поймано сервайсом, интерактивность была отключена.
почемуто ты связываеш две вещи о которых говорилось в разных контекстах... про то что события/пакеты приходят и без интерактивности сомнений нет и не было. (проверка была нужна только потому что ты писал, что по приходу пакета у тебя идет попытка запуска ("оно вообще запускается?"))

> И старт происходит без интерактивности.
а вот в этом как раз и сомнения, что он произойдет (нормально в "видимом" десктопе) по ShellExecute и без интерактивности.

не понимаю к чему рассуждения, трудно поставить галочку и проверить? а вот после того как убедишся что в том случае работает, вот тогда и дальше можно двигатся. (чтобы пришло внутреннее понимание... что все не просто так ;)


Digitman   (2006-01-25 15:01:00) [5]

Попробуй CreateProcess AtUser() вместо ShellExecute


Aleksandr.   (2006-01-25 14:55:00) [6]


> sniknik ©   (25.01.06 00:17) [19]
>
> а ты проверь, поставь интерактивность у сервиса, и главное
> убедись броадкаст пакеты то приходят (?), оно хоть пытается
> запустится (?).
> а подняли потому, что сбособ старта в [0] не будет адекватно
> без этого работать.

Я оставил на ночь шедулер, посылающие броадкасты, и сервайс - просто чтобы писали каждый в лог, что отправлено и что получено. Согласно логам отправки и получения, один в один. То есть каждое сообщение было поймано сервайсом, интерактивность была отключена. И старт происходит без интерактивности.


> Digitman ©   (25.01.06 08:51) [22]
>
>
> > Aleksandr.   (24.01.06 23:18) [18]
>
>
> А сервис твой стартует от имени какого пользователя ?


Ну, если я захожу в терминальную сессию под собой, видимо, от меня. Сервайс я делаю впервые, поэтому немного не ориентируюсь в вопросах.


sniknik   (2006-01-25 12:31:00) [7]

позже посмотрю, вечером... просто я тоже сейчас на работе. (какое совпадение ;о), и в общем "немного" занят)


Набережных С.   (2006-01-25 12:19:00) [8]


> sniknik ©   (25.01.06 08:32) [21]

Спасибо, получил и ответил, посмотри почту.

> да в общем, если затруднительно

Да не особо затруднительно, минут на 10-15:)) Просто код дома, а я на работе:))) Если заинтересует, просто напиши, скину.


Rouse_   (2006-01-25 09:22:00) [9]


> если не влом, выдели 2 процедуры/куска кода, одну той что
> принимаеш в сервисе, другую которой можно послать сообщение
> для проверки. (чтобы можно было эмулировать твое нерабочее/рабочее
> при разной интерактивности состояние), и пришли мне.

Ок, чуть попозже как время будет покоцаю сервис и пришлю...


Digitman   (2006-01-25 08:51:00) [10]


> Aleksandr.   (24.01.06 23:18) [18]


А сервис твой стартует от имени какого пользователя ?


sniknik   (2006-01-25 08:32:00) [11]

> Вечером сделаю, пришлю. Там запуск на интерактивном столе от имени интерактивного пользователя.
да в общем, если затруднительно, то не надо. отпиши только если сильные различия.
послал.

> Indy, если не ошибаюсь, использует только синхронный режим.
ну да. Indy "блокировочник", т.е. он ожидает событий, приходов пакетов из сети и этим ожиданием блокирует поток в котором ждет.
но события то все одно есть, и он их видит, с системы приходят. (иначе бы не работал) вот в [19] я и уточнял, у него все события в сервисе не ловятся или только специфичные для асинхронного режима. в общем можно с этим "поковыряться" ;).

2 Rouse_ ©
если не влом, выдели 2 процедуры/куска кода, одну той что принимаеш в сервисе, другую которой можно послать сообщение для проверки. (чтобы можно было эмулировать твое нерабочее/рабочее при разной интерактивности состояние), и пришли мне.


Набережных С.   (2006-01-25 06:57:00) [12]

Вышли пожалуйста, сюда: naberegnyhs на rambler.ru. Свой я вчера нашел, но, оказалось, я с ним потом еще экспириментировал, так что надо восстанавливать и лишнее выкидывать. Вечером сделаю, пришлю. Там запуск на интерактивном столе от имени интерактивного пользователя.

> пробовал с Indy

Indy, если не ошибаюсь, использует только синхронный режим.

> Rouse_ ©   (24.01.06 22:55) [16]

Странно это. Может, ты не учитываешь, что сообщения не проходят между потоками на разных десктопах?


sniknik   (2006-01-25 00:17:00) [13]

Rouse_ ©   (24.01.06 22:52) [15]
> У меня на асинхроннном оконные сообщения (FD_ACCEPT и т.п.) не идут ни в какую без интерактива :)
т.е. событий вообще нет, или только этих конкретных? я пробовал с Indy на прием (посылка понятно без проблем в принципе) работало, и без интерактивности. или это не то? но там тоже события приходят/обрабатываются от асинхронности не зависит. (делать асинхронным смысла не вижу, все одно оно в отдельном потоке, и с друим взаиможействовать/синхронизироваться не надо)

Набережных С. ©   (24.01.06 23:15) [17]
> А у тебя ссылки нет на этот пример? Любопытно было бы сравнить:)
ссылки нет. но если хочеш вышлю, пример то есть. мыло только дай, можеш свой прислать, может действительно что координально различается.

> Не понимаю, кстати, почему подняли тему про интерактивность и про десктопы - сервайс-то примитивный и
> без интерактивности - всего лишь ловит броадкаст по юдп, проверяет, послан ли он этому компьютеру и запускает заданное
> приложение.
а ты проверь, поставь интерактивность у сервиса, и главное убедись броадкаст пакеты то приходят (?), оно хоть пытается запустится (?).
а подняли потому, что сбособ старта в [0] не будет адекватно без этого работать.


Aleksandr.   (2006-01-24 23:18:00) [14]


> Digitman ©   (24.01.06 17:12) [1]
>
>
> > при этом никакого запуска приложения на самом деле не
> происходит
>
>
> с чего ты взял ?


Да, сорри, оно запустилось, но в совершенно другой терминальной сессии, тоже административной, как и та, в которой сервайс был запущен. Просто тогда возникает вопрос, почему сессии оказались разными и как их "синхронизировать".
Не понимаю, кстати, почему подняли тему про интерактивность и про десктопы - сервайс-то примитивный и без интерактивности - всего лишь ловит броадкаст по юдп, проверяет, послан ли он этому компьютеру и запускает заданное приложение.


Набережных С.   (2006-01-24 23:15:00) [15]


> sniknik ©   (24.01.06 22:27) [12]

Если откопаю свой, то завтра посчитаю, сколько там, ради интереса. А у тебя ссылки нет на этот пример? Любопытно было бы сравнить:)


Rouse_   (2006-01-24 22:55:00) [16]

Ааа, устройство :) Нет тут немного не то... Мне нужен рабочий цикл выборки сообщений, чтоб мое окно (AllocateHWnd) нотификационные мессаги принимало от системы :)


Rouse_   (2006-01-24 22:52:00) [17]


> и я конечно пользуюсь десктопом... на время отладки. в рабочем
> варианте взаимодействия не будет (ИМХО правильно).

Именно асинхронный или всежтаки неблокирующий? :) У меня на асинхроннном оконные сообщения (FD_ACCEPT и т.п.) не идут ни в какую без интерактива :)


sniknik   (2006-01-24 22:47:00) [18]

> хотел бы я посмотреть на тебя, когда перед тобой встанет задача реализовать транспорт на асинхронных сокетах в
> сервисе :)
приезжай смотри. ;о)) примерно такая задача именно сейчас у меня и стоит. ;)

не совсем конечно, но тоже транспорт, события от устройства надо в сеть транслировать, с "небольшим" анализом. и именно в сервисе, а сервис под NT (под W2k/XP устройство не работает, и не от нас это зависит).
и я конечно пользуюсь десктопом... на время отладки. в рабочем варианте взаимодействия не будет (ИМХО правильно).


Rouse_   (2006-01-24 22:31:00) [19]


> сервису надо разрешить работать с десктопом, а программистам
> которые пишут сервисы работающие с десктопом надо запретиь
> приближатся к компам ближе чем на 3 мили... ;)

Коль, хотел бы я посмотреть на тебя, когда перед тобой встанет задача реализовать транспорт на асинхронных сокетах в сервисе :) Если вдруг такая необходимость возникнет, вспомни свои слова и посмейся :)


sniknik   (2006-01-24 22:27:00) [20]

я скачивал с борланда, с раздела девелоперов.
> Author: Sasan Adami (s.adami@gmx.net) - aug 2003  

и насколько понимаю, вроде, ничего лишнего в нем нет. сократить можно, но не сильно (в основном за счет 18 строчного коментария-заголовка ;)).


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо