Форум: "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