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

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

Shell_NotifyIcon в Windows 2003


mikaa ©   (2008-09-18 11:43:00) 

Здравствуйте!
Пишу сервис Windows NT. Сервис имеет форму для контроля его работы. Форма сворачивается в System Tray. Для сворачивания использутся Shell_NotifyIcon в "стандартном" виде (в Инете полно ссылок по Shell_NotifyIcon). Проблема заключается в следующем: когда сервис запускается под Windows XP иконка в systray появляется, а под Windows 2003 не появляется.
Прошу помочь, если кто-нибудь с этим сталкивался


  (2009-07-03 02:11:00) [1]

Удалено модератором


Городской Шаман   (2008-09-22 01:49:00) [2]


> Eraser ©   (22.09.08 01:27) [13]
> > В общем можно инсталировать и запускать сервис под определённым
> > пользователем, но и там есть свои грабли
>
> не очень хорошая идея.


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


Eraser   (2008-09-22 01:27:00) [3]

> [0] mikaa ©   (18.09.08 11:43)

сервис вообще не должен иметь видимых окон, в висте и 2008 пользователи работают не в 0 терм. сессии, а xp и 2003 та же проблема возникнет при использовании FUS.

> В общем можно инсталировать и запускать сервис под определённым
> пользователем, но и там есть свои грабли

не очень хорошая идея.


Городской Шаман   (2008-09-21 09:22:00) [4]


> mikaa ©   (18.09.08 13:11) [3]
>
> Мне нужна некая аналогия с Borland Socket Server
> там есть форма с некоторыми настройками и сообщениями.
> Код Borland Socket Server взят за основу. Кстати он тоже
> не отображает иконку под Windows 2003


Там сервисы как в Vista работают в консоли 0, а первый пользователь в консоли 1.

В общем можно инсталировать и запускать сервис под определённым пользователем, но и там есть свои грабли.
SC_HANDLE WINAPI CreateService(
 SC_HANDLE hSCManager,
 LPCTSTR lpServiceName,
 LPCTSTR lpDisplayName,
 DWORD dwDesiredAccess,
 DWORD dwServiceType,
 DWORD dwStartType,
 DWORD dwErrorControl,
 LPCTSTR lpBinaryPathName,
 LPCTSTR lpLoadOrderGroup,
 LPDWORD lpdwTagId,
 LPCTSTR lpDependencies,
 LPCTSTR lpServiceStartName,
 LPCTSTR lpPassword

);

Вот пример но это для инсталяции драйвера(переделать под сервис дело двух минут)


procedure TForm1.InstallDriverButtonClick(Sender: TObject);
var
 scm: SC_HANDLE;
 lAppPath: WideString;
 lRes: Boolean;
begin
 lAppPath := WideIncludeTrailingPathDelimiter(WideExtractFilePath(Application.ExeName));

 scm := OpenSCManagerW(nil, nil, SC_MANAGER_ALL_ACCESS);
 if scm <> 0 then
   begin
     lRes := InstallDriver(scm, DriverName, lAppPath + DriverName);
     Caption := FormatDateTime('hh:nn:ss.zzz', now) + ' install driver = ' + BoolToStr(lRes, True);

     CloseServiceHandle(scm);
   end;
end;

function InstallDriver(scm: SC_HANDLE; const DriverName: WideString; const DriverExec: WideString): Boolean;
var
 lService: SC_HANDLE;
 lErr: DWORD;
begin
 //инициализация, проверки
 result := False;
 if (scm = 0) or (Length(DriverName) = 0) or (Length(DriverExec) = 0) then Exit;
 //создание сервиса/драйвера
 lService := CreateServiceW(
   scm,
   PWideChar(DriverName),
   PWideChar(DriverName),
   SERVICE_ALL_ACCESS,
   SERVICE_KERNEL_DRIVER,
   SERVICE_DEMAND_START,
   SERVICE_ERROR_NORMAL,
   PWideChar(DriverExec),
   nil, nil, nil, nil, nil);

 //проверка на ошибку
 if lService = 0 then
   begin
     lErr := GetLastError;
     if lErr = ERROR_SERVICE_EXISTS then Result := True;
     //Logger.DebugLog('uDriverLoader', 'InstallDriver', 'Error '+IntToStr(lErr));

     Exit;
   end;

 //закрываем указатель
 CloseServiceHandle(lService);
 Result := True;
end;


Сергей М.   (2008-09-18 21:33:00) [5]


> Borland Socket Server взят за основу


BSS, вообще-то, демо-проект.

И пИсан он был еще тогда, когда Windows 2003 был только в планах зачатия у мелкомягких.

В "боевых" проектах мухи и котлеты живут отдельно, см. [1]


МистерТ   (2008-09-18 21:28:00) [6]

Как вариант - можно этот же самый .ехе грузить, только вызывать его надо будет от имени загруженного пользователя и с каким-нибудь ключем, например /gui
Примерно так же касперский поступает, висит в виде двух процессов avp.exe один системный, другой пользовательский.
А между сервисом и графический оболочкой данные можно передавать (как уже тут отмечали) через
* сокеты
* именованные каналы
* СОМ
эти варианты намного надежнее, чем интерактивный сервис.

З.Ы. под вистой интерактивные сервисы вообще запрещены кстати.


DVM   (2008-09-18 21:08:00) [7]


> "Interact with desktop" включена

Это вообще порочная практика. Лучше выключи.
Лучше напиши отдельную прогу, которая будет добавлять иконку в область уведомлений при загрузке эксплорера. Ну а прога пусть взаимодействует с сервисом, например, через именованные каналы.


МистерТ   (2008-09-18 17:11:00) [8]

> mikaa ©   (18.09.08 11:43)
1) Приведите код "создания" иконки.
У меня проблем с W2k3 не было, хотя такой же изврат делал.
2) Советую отказаться от интерактивного сервиса, проблемы потом будут однозначно.


Dennis I. Komarov   (2008-09-18 13:47:00) [9]

А можешь и не писать отдельную, а сделать управление через HTTP


Dennis I. Komarov   (2008-09-18 13:46:00) [10]

[1] +1


mikaa   (2008-09-18 13:21:00) [11]

"Interact with desktop" включена
TaskbarCreated перехватывается о обрабатывается в WndProc


LonelyWolf   (2008-09-18 13:17:00) [12]

Кстати, а в настройках сервиса есть такая фича как "Interact with desktop".
Быть может ее надо выставить?


mikaa   (2008-09-18 13:11:00) [13]

Мне нужна некая аналогия с Borland Socket Server
там есть форма с некоторыми настройками и сообщениями.
Код Borland Socket Server взят за основу. Кстати он тоже не отображает иконку под Windows 2003


LonelyWolf   (2008-09-18 12:37:00) [14]

Быть может твой сервис под 2003 стартует до того как стартанул Explorer?
При создании/пересоздании трея эксплорер рассылает мессагу "TaskbarCreated". Попробуй ее отлавливать и пересоздавать иконку...

mTaskBarCreated:= RegisterWindowMessage('TaskbarCreated');
и т.д...

ЗЫ: IMHO clickmaker прав, в сервис пихать форму - это жестоко...


clickmaker   (2008-09-18 12:21:00) [15]

пиши отдельную прогу для управления сервисом.
по-хорошему, сервис не должен иметь окон.


Наверх

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