Конференция "WinAPI" » Shell_NotifyIcon в Windows 2003
 
  • mikaa © (18.09.08 11:43) [0]
    Здравствуйте!
    Пишу сервис Windows NT. Сервис имеет форму для контроля его работы. Форма сворачивается в System Tray. Для сворачивания использутся Shell_NotifyIcon в "стандартном" виде (в Инете полно ссылок по Shell_NotifyIcon). Проблема заключается в следующем: когда сервис запускается под Windows XP иконка в systray появляется, а под Windows 2003 не появляется.
    Прошу помочь, если кто-нибудь с этим сталкивался
  • clickmaker © (18.09.08 12:21) [1]
    пиши отдельную прогу для управления сервисом.
    по-хорошему, сервис не должен иметь окон.
  • LonelyWolf (18.09.08 12:37) [2]
    Быть может твой сервис под 2003 стартует до того как стартанул Explorer?
    При создании/пересоздании трея эксплорер рассылает мессагу "TaskbarCreated". Попробуй ее отлавливать и пересоздавать иконку...

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

    ЗЫ: IMHO clickmaker прав, в сервис пихать форму - это жестоко...
  • mikaa © (18.09.08 13:11) [3]
    Мне нужна некая аналогия с Borland Socket Server
    там есть форма с некоторыми настройками и сообщениями.
    Код Borland Socket Server взят за основу. Кстати он тоже не отображает иконку под Windows 2003
  • LonelyWolf (18.09.08 13:17) [4]
    Кстати, а в настройках сервиса есть такая фича как "Interact with desktop".
    Быть может ее надо выставить?
  • mikaa © (18.09.08 13:21) [5]
    "Interact with desktop" включена
    TaskbarCreated перехватывается о обрабатывается в WndProc
  • Dennis I. Komarov © (18.09.08 13:46) [6]
    [1] +1
  • Dennis I. Komarov © (18.09.08 13:47) [7]
    А можешь и не писать отдельную, а сделать управление через HTTP
  • МистерТ (18.09.08 17:11) [8]
    > mikaa ©   (18.09.08 11:43)
    1) Приведите код "создания" иконки.
    У меня проблем с W2k3 не было, хотя такой же изврат делал.
    2) Советую отказаться от интерактивного сервиса, проблемы потом будут однозначно.
  • DVM © (18.09.08 21:08) [9]

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

    Это вообще порочная практика. Лучше выключи.
    Лучше напиши отдельную прогу, которая будет добавлять иконку в область уведомлений при загрузке эксплорера. Ну а прога пусть взаимодействует с сервисом, например, через именованные каналы.
  • МистерТ (18.09.08 21:28) [10]
    Как вариант - можно этот же самый .ехе грузить, только вызывать его надо будет от имени загруженного пользователя и с каким-нибудь ключем, например /gui
    Примерно так же касперский поступает, висит в виде двух процессов avp.exe один системный, другой пользовательский.
    А между сервисом и графический оболочкой данные можно передавать (как уже тут отмечали) через
    * сокеты
    * именованные каналы
    * СОМ
    эти варианты намного надежнее, чем интерактивный сервис.

    З.Ы. под вистой интерактивные сервисы вообще запрещены кстати.
  • Сергей М. © (18.09.08 21:33) [11]

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


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

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

    В "боевых" проектах мухи и котлеты живут отдельно, см. [1]
  • Городской Шаман (21.09.08 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 © (22.09.08 01:27) [13]
    > [0] mikaa ©   (18.09.08 11:43)

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

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

    не очень хорошая идея.
  • Городской Шаман (22.09.08 01:49) [14]

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


    Не стоит мешать человеку ходить по граблям. Пока он это не познает на своём личном опыте, до тех пор будет использовать "странные" решения.
  • имя (03.07.09 02:11) [15]
    Удалено модератором
 
Конференция "WinAPI" » Shell_NotifyIcon в Windows 2003
Есть новые Нет новых   [134434   +27][b:0][p:0.002]