Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2011.03.20;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2011.03.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
15-1291751037
Сергей М.
2010-12-07 22:43
2011.03.20
А как нужно умудриться


2-1293283172
sonny2son
2010-12-25 16:19
2011.03.20
Посоветуйте, как установить?


15-1291724614
Омлет
2010-12-07 15:23
2011.03.20
Что будет, когда закончатся IPv4-адреса?


2-1293407915
Тимоха111
2010-12-27 02:58
2011.03.20
динамический pagecontol и событие к нему


15-1291411776
Юрий
2010-12-04 00:29
2011.03.20
С днем рождения ! 4 декабря 2010 суббота





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский