OVH Cloud OVH Cloud

Systray et application console

11 réponses
Avatar
Alain Migeon
Bonjour

J'ai une application type console, que je dois faire fonctionner en=20
service, sous Windows 2000 et VC6.

Cette application a besoin d'une ic=F4ne dans le systray.

Dans cette optique, j'ai fait les op=E9rations suivantes :
- r=E9cup=E9ration d'un HMODULE que j'utilise comme HINSTANCE avec
GetModuleHandle ()
- cr=E9ation d'une fen=EAtre invisible, de mani=E8re =E0 avoir un hWnd
- d=E9finition d'un WM_xxx de mani=E8re =E0 r=E9cup=E9rer les messages
- appel de Shell_NotifyIcon.

L'appel de Shell_NotifyIcon renvoie 1, et l'ic=F4ne apparait bien dans le=
=20
systray.

Le probl=E8me que j'ai est qu'aucune action sur l'ic=F4ne ne renvoie de=20
message.

Le probl=E8me peut-il venir du fait que mon applcation est de type=20
console?

Alain


Extrait du code.

// r=E9cup=E9ration du HINSTANCE.
m_hModule =3D GetModuleHandle (NULL);
m_hInstance =3D m_hModule;

// cr=E9ation de la fen=EAtre, et de HWND.
WNDCLASSEX=09 wc;
int=09=09 ret;

wc.cbSize=09 =3D sizeof (WNDCLASSEX);
wc.style=09 =3D 0;
wc.lpfnWndProc =3D this->WndProc;
wc.cbClsExtra=09 =3D wc.cbWndExtra =3D 0;
wc.hInstance=09 =3D m_hInstance;
wc.hIcon =3D LoadIcon (m_hInstance, MAKEINTRESOURCE (IDI_ICON0));
wc.hIconSm =3D (HICON) LoadImage (m_hInstance,
MAKEINTRESOURCE(IDI_ICON0),
IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON), 0);
wc.hCursor=09 =3D LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground =3D (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName =3D NULL;
wc.lpszClassName =3D className.c_str ();

ret =3D RegisterClassEx (&wc);

if (ret !=3D 0)
=09m_hWnd =3D CreateWindowEx (0,
className.c_str (), className.c_str (),
WS_POPUPWINDOW, CW_USEDEFAULT, 0,
CW_USEDEFAULT, 0, NULL, NULL,
m_hInstance, NULL);

// cr=E9ation de l'ic=F4ne.
#define WM_ICON_NOTIFY WM_USER+10

int=09=09=09=09=09 ret;

nid.cbSize =3D sizeof (NOTIFYICONDATA);
nid.hWnd =3D m_hWnd;
nid.uID =3D uID;
nid.uFlags =3D NIF_MESSAGE | NIF_ICON | NIF_TIP;
nid.uCallbackMessage =3D WM_ICON_NOTIFY;
nid.hIcon =3D icon;
strcpy (nid.szTip, szToolTip.c_str ());

// Set the tray icon
ret =3D Shell_NotifyIcon (NIM_ADD, &nid);

10 réponses

1 2
Avatar
Thierry
Bonjour,

Alain Migeon a écrit :

Le problème peut-il venir du fait que mon applcation est de type
console?



Plutot a cause que ce soit un service. Tu as bien le flag "USE_INTERACTIVE"
au service ?

--
« Willy, j'ai mangé le chat. »
Avatar
Alain Migeon
In article ,
says...
Bonjour,

Alain Migeon a écrit :

> Le problème peut-il venir du fait que mon applcation est de type
> console?

Plutot a cause que ce soit un service. Tu as bien le flag "USE_INTERACTIV E"
au service ?



Mon programme peut tourner en simple application ou en service. Le
contrôle se fait en passant un argument au programme.

Pour les tests, je teste en mode application, car c'est plus facile pour
débogguer.
J'ai essayé d'installer en service, et de le démarrer.
Le problème est identique : l'icône apparait dans le systray, mais pas
moyen d'obtenir un message.

Alain
Avatar
Thierry
Bonjour,

Alain Migeon a écrit :


J'ai essayé d'installer en service, et de le démarrer.
Le problème est identique : l'icône apparait dans le systray, mais pas
moyen d'obtenir un message.



CreateService:
dwServiceType
[...]
If you specify either SERVICE_WIN32_OWN_PROCESS or
SERVICE_WIN32_SHARE_PROCESS, you can also specify the following type. Type
Meaning :
SERVICE_INTERACTIVE_PROCESS Enables a service to interact with the
desktop.

T'as bien mis ce flag ?

--
« Willy, j'ai mangé le chat. »
Avatar
Alain Migeon
In article ,
says...
Bonjour,

Alain Migeon a écrit :


> J'ai essayé d'installer en service, et de le démarrer.
> Le problème est identique : l'icône apparait dans le systray, mais pas
> moyen d'obtenir un message.

CreateService:
dwServiceType
[...]
If you specify either SERVICE_WIN32_OWN_PROCESS or
SERVICE_WIN32_SHARE_PROCESS, you can also specify the following type. Typ e
Meaning :
SERVICE_INTERACTIVE_PROCESS Enables a service to interact with the
desktop.

T'as bien mis ce flag ?



Oui. J'ai bien mis ce flag. Le problème n'est pas lié au service.
Mon problème est que je n'arrive pas à obtenir de message venant de
l'icône qui est dans mon systray, que ce soit en service ou en
application.

Alain
Avatar
Alain Migeon
In article ,
says...
In article ,
says...
> Bonjour,
>
> Alain Migeon a écrit :
>
>
> > J'ai essayé d'installer en service, et de le démarrer.
> > Le problème est identique : l'icône apparait dans le systray, mai s pas
> > moyen d'obtenir un message.
>
> CreateService:
> dwServiceType
> [...]
> If you specify either SERVICE_WIN32_OWN_PROCESS or
> SERVICE_WIN32_SHARE_PROCESS, you can also specify the following type. T ype
> Meaning :
> SERVICE_INTERACTIVE_PROCESS Enables a service to interact with the
> desktop.
>
> T'as bien mis ce flag ?

Oui. J'ai bien mis ce flag. Le problème n'est pas lié au service.
Mon problème est que je n'arrive pas à obtenir de message venant de
l'icône qui est dans mon systray, que ce soit en service ou en
application.



En fait, j'au trouvé l'erreur.
J'avais oublié la boucle de gestion des messages.

Alain


MSG msg;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Avatar
Arnaud Debaene
Alain Migeon wrote:
Bonjour

J'ai une application type console, que je dois faire fonctionner en
service, sous Windows 2000 et VC6.

Cette application a besoin d'une icône dans le systray.



Mauvais plan : Un service ne devrait JAMAIS avoir de GUI, pour des raisons
de sécurité. Micrososft est en train de pousser petit à petit le flag
SERVICE_INTERACTIVE_PROCESS vers les antiquités deprecated (il n'est pas
impossible que ce soit carrément interdit dans Longhorn).
Si tu veux des détails sur le pourquoi, google-ise un peu sur "shatter
attack".

Tu devrais faire une appli GUI séparée qui affiche l'icone dans la systray
et qui communique avec ton service via un mécanisme IPC que tu contrôles.

Arnaud
Avatar
François Müller
"Arnaud Debaene" escribió en el mensaje
news:403e716e$0$28144
| Mauvais plan : Un service ne devrait JAMAIS avoir de GUI, pour des raisons
| de sécurité. Micrososft est en train de pousser petit à petit le flag
| SERVICE_INTERACTIVE_PROCESS vers les antiquités deprecated (il n'est pas
| impossible que ce soit carrément interdit dans Longhorn).
| Si tu veux des détails sur le pourquoi, google-ise un peu sur "shatter
| attack".
| Tu devrais faire une appli GUI séparée qui affiche l'icone dans la systray
| et qui communique avec ton service via un mécanisme IPC que tu contrôles.

Entièrment d'accord

F.
Avatar
François Müller
Bonjour

"Alain Migeon" escribió en el mensaje
news:

J'ai une application type console, que je dois faire fonctionner en
service, sous Windows 2000 et VC6.



Cette application a besoin d'une icône dans le systray.



Tu proposes un etrange mélange de genre. Je sais bien qu'il existe une
possibilité pour un service d'interagir avec le bureau, mais ce n'est pas
une raison pour l'utiliser (d'autant que ce faisant, ton service ne peut pas
faire un certain nombre de chose, par exemple, utiliser des ressources sur
le réseau, -enfin pas simplement- à cause des limitation du compte
LocalSystem.

Pourquoi ne fais tu pas une DLL, qui gère ton systray, et implémente un
mécanisme de comunication avec ton service (via RPC, par exemple) ?

F.
Avatar
Thierry
Bonjour,

Arnaud Debaene a écrit :

Si tu veux des détails sur le pourquoi, google-ise un peu sur "shatter
attack".



Y'a même une version française:
http://www.katabatik.com/ktk/sections.php?op=viewarticle&artid"

--
« Willy, j'ai mangé le chat. »
Avatar
Alain Migeon
In article <c1n3c4$1jucn7$,
says...
Bonjour

"Alain Migeon" escribió en el mensaje
news:

>J'ai une application type console, que je dois faire fonctionner en
>service, sous Windows 2000 et VC6.

>Cette application a besoin d'une icône dans le systray.

Tu proposes un etrange mélange de genre. Je sais bien qu'il existe une
possibilité pour un service d'interagir avec le bureau, mais ce n'est p as
une raison pour l'utiliser (d'autant que ce faisant, ton service ne peut pas
faire un certain nombre de chose, par exemple, utiliser des ressources su r
le réseau, -enfin pas simplement- à cause des limitation du compte
LocalSystem.

Pourquoi ne fais tu pas une DLL, qui gère ton systray, et implémente un
mécanisme de comunication avec ton service (via RPC, par exemple) ?



Merci de vos conseils.

Je ne suis pas expert en programmation Windows, ni en gestion de
service. C'est la première fois que j'ai à en programmer.

Le but de l'opération est de permettre à un système constitué de
plusieurs serveurs (4 à 5), de redémarrer automatiquement après un
reboot de la machine.
La solution consiste à transformer ces serveurs en services.

Ce que j'aimerais avoir, c'est une icône dans le systray, offrant un
menu avec les icönes de mes services et permettant d'interréagir avec
eux. Je souhaiterais avoir cette icône visible lorsqu'un utilisateur se
loggue.
Pour un de mes serveurs, j'aimerais pouvoir ouvrir une fenêtre de log,
par exemple, en cliquant sur son icône.

Une simple DLL peut-elle suffire? Ou dois je faire un programme
classique communiquant avec mes serveurs?

Quel serait alors le meilleur protocole à utiliser? Il m'a été sugg éré
IPC et RPC. Je ne connais rien de IPC, mais je connais la version ONC de
RPC (pas la version Microsoft), et je sais commant écrire un protocole
et générer les stubs. ONC RPC est déja utilisé par les serveurs.

Alain
1 2