Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.03.20;
Скачать: CL | DM;

Вниз

Shell_NotifyIcon в Windows 2003   Найти похожие ветки 

 
mikaa ©   (2008-09-18 11:43) [0]

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


 
clickmaker ©   (2008-09-18 12:21) [1]

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


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

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

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

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


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

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


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

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


 
mikaa ©   (2008-09-18 13:21) [5]

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


 
Dennis I. Komarov ©   (2008-09-18 13:46) [6]

[1] +1


 
Dennis I. Komarov ©   (2008-09-18 13:47) [7]

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


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

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


 
DVM ©   (2008-09-18 21:08) [9]


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

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


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

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

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


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


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


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

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

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


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


> 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;


 
Eraser ©   (2008-09-22 01:27) [13]

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

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

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

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


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


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


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


 
имя   (2009-07-03 02:11) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2011.03.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1293114638
12
2010-12-23 17:30
2011.03.20
определить текущую ячейку в TStringGrid


6-1200848613
Maloj2007
2008-01-20 20:03
2011.03.20
Связь TIdTCPServer и TIdTCPClient


2-1293098804
RUu
2010-12-23 13:06
2011.03.20
объединение наборов данных


1-1249315691
sunnmas
2009-08-03 20:08
2011.03.20
узнать о завершении потока


2-1293130116
dreamse
2010-12-23 21:48
2011.03.20
Подскажите как прочитать из переменой