-
Здравствуйте! Пишу сервис Windows NT. Сервис имеет форму для контроля его работы. Форма сворачивается в System Tray. Для сворачивания использутся Shell_NotifyIcon в "стандартном" виде (в Инете полно ссылок по Shell_NotifyIcon). Проблема заключается в следующем: когда сервис запускается под Windows XP иконка в systray появляется, а под Windows 2003 не появляется. Прошу помочь, если кто-нибудь с этим сталкивался
-
пиши отдельную прогу для управления сервисом. по-хорошему, сервис не должен иметь окон.
-
Быть может твой сервис под 2003 стартует до того как стартанул Explorer? При создании/пересоздании трея эксплорер рассылает мессагу "TaskbarCreated". Попробуй ее отлавливать и пересоздавать иконку...
mTaskBarCreated:= RegisterWindowMessage('TaskbarCreated'); и т.д...
ЗЫ: IMHO clickmaker прав, в сервис пихать форму - это жестоко...
-
Мне нужна некая аналогия с Borland Socket Server там есть форма с некоторыми настройками и сообщениями. Код Borland Socket Server взят за основу. Кстати он тоже не отображает иконку под Windows 2003
-
Кстати, а в настройках сервиса есть такая фича как "Interact with desktop". Быть может ее надо выставить?
-
"Interact with desktop" включена TaskbarCreated перехватывается о обрабатывается в WndProc
-
[1] +1
-
А можешь и не писать отдельную, а сделать управление через HTTP
-
> mikaa © (18.09.08 11:43) 1) Приведите код "создания" иконки. У меня проблем с W2k3 не было, хотя такой же изврат делал. 2) Советую отказаться от интерактивного сервиса, проблемы потом будут однозначно.
-
> "Interact with desktop" включена
Это вообще порочная практика. Лучше выключи. Лучше напиши отдельную прогу, которая будет добавлять иконку в область уведомлений при загрузке эксплорера. Ну а прога пусть взаимодействует с сервисом, например, через именованные каналы.
-
Как вариант - можно этот же самый .ехе грузить, только вызывать его надо будет от имени загруженного пользователя и с каким-нибудь ключем, например /gui Примерно так же касперский поступает, висит в виде двух процессов avp.exe один системный, другой пользовательский. А между сервисом и графический оболочкой данные можно передавать (как уже тут отмечали) через * сокеты * именованные каналы * СОМ эти варианты намного надежнее, чем интерактивный сервис.
З.Ы. под вистой интерактивные сервисы вообще запрещены кстати.
-
> Borland Socket Server взят за основу
BSS, вообще-то, демо-проект.
И пИсан он был еще тогда, когда Windows 2003 был только в планах зачатия у мелкомягких.
В "боевых" проектах мухи и котлеты живут отдельно, см. [1]
-
> 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;
Exit;
end;
CloseServiceHandle(lService);
Result := True;
end;
-
> [0] mikaa © (18.09.08 11:43)
сервис вообще не должен иметь видимых окон, в висте и 2008 пользователи работают не в 0 терм. сессии, а xp и 2003 та же проблема возникнет при использовании FUS.
> В общем можно инсталировать и запускать сервис под определённым > пользователем, но и там есть свои грабли
не очень хорошая идея.
-
> Eraser © (22.09.08 01:27) [13] > > В общем можно инсталировать и запускать сервис под определённым > > пользователем, но и там есть свои грабли > > не очень хорошая идея.
Не стоит мешать человеку ходить по граблям. Пока он это не познает на своём личном опыте, до тех пор будет использовать "странные" решения.
-
Удалено модератором
|