EnumWindow API insuffisant sous Terminal Server (panique!)
12 réponses
Philippe
Bonjour,
je viens d'écrire une application en VB6, dont un programme est chargé
d'envoyer un message windows à toutes les fenetres d'un certain type de
la machine.
Cela marche très bien avec EnumWindow, mais seulement aussi longtemps
qu'on est sans Terminal.
Sous Terminal server, on ne trouve que les fenetres de la session
courante, pas celles des autres sessions.
j'ai trouvé je viens d'enlever le douche BS pour un BS simple dans les noms de share et d'event. Maintenant ca marche....
RE RE correction. Sur NT4 il faut simple backslash sinon plante, sur TS (et probablement W2000) il en faut 2 sinon ca plante, je t'assure. :o))
- NT4 ne connait pas les Terminal Server et un nom d'objet du type "GlobalBDD_EVENT" est invalide sous cet OS.
- Si tu tapes directement "GlobalBDD_EVENT" dans une source C++, la chaine réelle passée à CreateEvent est "Global"<backspace>"BDD_EVENT", autrement dit un nom qui n'est pas du tout dans l'espace de nommage global, donc qui ne marche pas avec TS. Cherches dans ton bouquin de C les "Escape Sequences" pour comprendre pourquoi.
Il faut donc bien taper "GlobalBDD_EVENT" dans le source, mais ce nest pas un nom valide sous NT4. Si tu as besoin de faire tourner ton soft aussi sous NT4, il faut que tu construise le nom de l'Event en fonction de la version de l'OS (GetVersionEx).
Arnaud
Philippe wrote:
Philippe wrote:
Philippe wrote:
j'ai trouvé je viens d'enlever le douche BS pour un BS simple dans
les noms de share et d'event. Maintenant ca marche....
RE RE correction. Sur NT4 il faut simple backslash sinon plante, sur
TS (et probablement W2000) il en faut 2 sinon ca plante, je t'assure.
:o))
- NT4 ne connait pas les Terminal Server et un nom d'objet du type
"GlobalBDD_EVENT" est invalide sous cet OS.
- Si tu tapes directement "GlobalBDD_EVENT" dans une source C++, la chaine
réelle passée à CreateEvent est "Global"<backspace>"BDD_EVENT", autrement
dit un nom qui n'est pas du tout dans l'espace de nommage global, donc qui
ne marche pas avec TS. Cherches dans ton bouquin de C les "Escape Sequences"
pour comprendre pourquoi.
Il faut donc bien taper "Global\BDD_EVENT" dans le source, mais ce nest pas
un nom valide sous NT4. Si tu as besoin de faire tourner ton soft aussi sous
NT4, il faut que tu construise le nom de l'Event en fonction de la version
de l'OS (GetVersionEx).
j'ai trouvé je viens d'enlever le douche BS pour un BS simple dans les noms de share et d'event. Maintenant ca marche....
RE RE correction. Sur NT4 il faut simple backslash sinon plante, sur TS (et probablement W2000) il en faut 2 sinon ca plante, je t'assure. :o))
- NT4 ne connait pas les Terminal Server et un nom d'objet du type "GlobalBDD_EVENT" est invalide sous cet OS.
- Si tu tapes directement "GlobalBDD_EVENT" dans une source C++, la chaine réelle passée à CreateEvent est "Global"<backspace>"BDD_EVENT", autrement dit un nom qui n'est pas du tout dans l'espace de nommage global, donc qui ne marche pas avec TS. Cherches dans ton bouquin de C les "Escape Sequences" pour comprendre pourquoi.
Il faut donc bien taper "GlobalBDD_EVENT" dans le source, mais ce nest pas un nom valide sous NT4. Si tu as besoin de faire tourner ton soft aussi sous NT4, il faut que tu construise le nom de l'Event en fonction de la version de l'OS (GetVersionEx).
Arnaud
Philippe
Re bonjour à tous, et surtout ceux qui m'ont aidé. Je voulais juste faire un petit rapport sur la manière dont j'ai fini par résoudre ce probleme (Win2000, 2003, et VB6 exclusivement).
J'utilise donc bien des evenements systemes. Pour cela je me suis intensément inspiré de l'exemple Remi Thomas, un grand merci à lui.
Mais cela ne suffit pas, il faut aussi que les appli clientes ne bloquent pas. Pour cela il faut un thread, facile en C, super-mega chiant en VB. Heureusement voici une référence avec un exemple appliqué en VB :
http://www.freevbcode.com/ShowCode.asp?
Donc ce qui se passe :
- les appli clientes créent toutes en plus de leur formes d'application une fenetre supplementaire, sur laquelle un nouvelle Procedure de fenetre (pour les message) sera defini (SetWindowLong). Cette proc de fenetre ne fera rien d'autre que mettre à jour les infos de l'appli (Form.DoRefresh, l'objectif de la manoeuvre).
- les appli clientes creent en plus toutes un thread VB, qui lui ne fera rien d'autre que d'attendre (WaitForSingleObject) qu'un evenement que j'aurai préalablement défini (CreateEvent) survienne (PulseEvent). Dès que celui-ci survient, il envoi un message Windows (PostMessage) à la fenetre speciale que l'appli client aura préalablement crée pour cet effet. Le message envoyé, le thread retourne immediatement attendre l'evenement prochain.
- l'appli cliente est remise à jour
- l'appli server est appele à la demande par une composante quelconque (server ColdFusion), et ne fait rien d'autre que de provoquer l'evenement (PulseEvent), avant de se refermer de suite.
Le tout en VB, mais attention à bien lire les données du lien ci-dessus. Je suis disposer à filer le code de l'appli test en VB que j'ai fait, laissez moi une email sur http://phm.michel.free.fr/php/contact/
Sinon, et pour finir, après quelques 16 ans et plus de C, je pense avoir "enfin" compris ce qu'est un backslash, mais ceci dit, cela a moins à voir avec la syntax du C, que du role que décidera de lui jouer les fonctions C appelée. Un "" restera une chaine de charactère avec 1 element, et "n" une chaine avec 2 elements. Ce que printf ou tout autre fonction de l'API en fait, ne regarde qu'elle. Par contre ´n´ est tout autre chose.... Peut-etre faut-il avoir fait du Vb pour etre sensibilisé à cela.... à bon entendeur salut ! ;->
Et encore Merci à Remi, mon sauveur :o)
a+ Philippe
Remi Thomas wrote:
Salut,
Merci pour ta réponse, je suis entrain de réetudier l'option Event. Mais je pense qu'il y a 3 inconvénients:
1- est-ce praticable en vb6, ou vais-je bloquer l'appli jusqu'à ce qu'un evenement survienne ?
C'est le problème, il faut créer un thread qui attend. Facile en C, plus délicat en VB6
2- Lorsqu'un server declanche un évenement, est-ce que les X clients derrières seront informés de l'évenement, ou seulement le premier ?
Tous les clients sont abonnées
3- S'il faut un evenement par client, je ne sais jamais combien de client sont courament executés....
Pas besoin, l'exemple fonctionne avec autant de client que tu veux, dans la limite des ressources de la machine.
Rémi
Re bonjour à tous, et surtout ceux qui m'ont aidé.
Je voulais juste faire un petit rapport sur la manière dont j'ai fini
par résoudre ce probleme (Win2000, 2003, et VB6 exclusivement).
J'utilise donc bien des evenements systemes. Pour cela je me suis
intensément inspiré de l'exemple Remi Thomas, un grand merci à lui.
Mais cela ne suffit pas, il faut aussi que les appli clientes ne
bloquent pas. Pour cela il faut un thread, facile en C, super-mega
chiant en VB. Heureusement voici une référence avec un exemple appliqué
en VB :
http://www.freevbcode.com/ShowCode.asp?ID@29
Donc ce qui se passe :
- les appli clientes créent toutes en plus de leur formes d'application
une fenetre supplementaire, sur laquelle un nouvelle Procedure de
fenetre (pour les message) sera defini (SetWindowLong). Cette proc de
fenetre ne fera rien d'autre que mettre à jour les infos de l'appli
(Form.DoRefresh, l'objectif de la manoeuvre).
- les appli clientes creent en plus toutes un thread VB, qui lui ne fera
rien d'autre que d'attendre (WaitForSingleObject) qu'un evenement que
j'aurai préalablement défini (CreateEvent) survienne (PulseEvent). Dès
que celui-ci survient, il envoi un message Windows (PostMessage) à la
fenetre speciale que l'appli client aura préalablement crée pour cet
effet. Le message envoyé, le thread retourne immediatement attendre
l'evenement prochain.
- l'appli cliente est remise à jour
- l'appli server est appele à la demande par une composante quelconque
(server ColdFusion), et ne fait rien d'autre que de provoquer
l'evenement (PulseEvent), avant de se refermer de suite.
Le tout en VB, mais attention à bien lire les données du lien ci-dessus.
Je suis disposer à filer le code de l'appli test en VB que j'ai fait,
laissez moi une email sur http://phm.michel.free.fr/php/contact/
Sinon, et pour finir, après quelques 16 ans et plus de C, je pense avoir
"enfin" compris ce qu'est un backslash, mais ceci dit, cela a moins à
voir avec la syntax du C, que du role que décidera de lui jouer les
fonctions C appelée. Un "" restera une chaine de charactère avec 1
element, et "n" une chaine avec 2 elements. Ce que printf ou tout autre
fonction de l'API en fait, ne regarde qu'elle. Par contre ´n´ est tout
autre chose.... Peut-etre faut-il avoir fait du Vb pour etre sensibilisé
à cela.... à bon entendeur salut ! ;->
Et encore Merci à Remi, mon sauveur :o)
a+
Philippe
Remi Thomas wrote:
Salut,
Merci pour ta réponse, je suis entrain de réetudier l'option Event. Mais
je pense qu'il y a 3 inconvénients:
1- est-ce praticable en vb6, ou vais-je bloquer l'appli jusqu'à ce qu'un
evenement survienne ?
C'est le problème, il faut créer un thread qui attend.
Facile en C, plus délicat en VB6
2- Lorsqu'un server declanche un évenement, est-ce que les X clients
derrières seront informés de l'évenement, ou seulement le premier ?
Tous les clients sont abonnées
3- S'il faut un evenement par client, je ne sais jamais combien de client
sont courament executés....
Pas besoin, l'exemple fonctionne avec autant de client que tu veux, dans la
limite des ressources de la machine.
Re bonjour à tous, et surtout ceux qui m'ont aidé. Je voulais juste faire un petit rapport sur la manière dont j'ai fini par résoudre ce probleme (Win2000, 2003, et VB6 exclusivement).
J'utilise donc bien des evenements systemes. Pour cela je me suis intensément inspiré de l'exemple Remi Thomas, un grand merci à lui.
Mais cela ne suffit pas, il faut aussi que les appli clientes ne bloquent pas. Pour cela il faut un thread, facile en C, super-mega chiant en VB. Heureusement voici une référence avec un exemple appliqué en VB :
http://www.freevbcode.com/ShowCode.asp?
Donc ce qui se passe :
- les appli clientes créent toutes en plus de leur formes d'application une fenetre supplementaire, sur laquelle un nouvelle Procedure de fenetre (pour les message) sera defini (SetWindowLong). Cette proc de fenetre ne fera rien d'autre que mettre à jour les infos de l'appli (Form.DoRefresh, l'objectif de la manoeuvre).
- les appli clientes creent en plus toutes un thread VB, qui lui ne fera rien d'autre que d'attendre (WaitForSingleObject) qu'un evenement que j'aurai préalablement défini (CreateEvent) survienne (PulseEvent). Dès que celui-ci survient, il envoi un message Windows (PostMessage) à la fenetre speciale que l'appli client aura préalablement crée pour cet effet. Le message envoyé, le thread retourne immediatement attendre l'evenement prochain.
- l'appli cliente est remise à jour
- l'appli server est appele à la demande par une composante quelconque (server ColdFusion), et ne fait rien d'autre que de provoquer l'evenement (PulseEvent), avant de se refermer de suite.
Le tout en VB, mais attention à bien lire les données du lien ci-dessus. Je suis disposer à filer le code de l'appli test en VB que j'ai fait, laissez moi une email sur http://phm.michel.free.fr/php/contact/
Sinon, et pour finir, après quelques 16 ans et plus de C, je pense avoir "enfin" compris ce qu'est un backslash, mais ceci dit, cela a moins à voir avec la syntax du C, que du role que décidera de lui jouer les fonctions C appelée. Un "" restera une chaine de charactère avec 1 element, et "n" une chaine avec 2 elements. Ce que printf ou tout autre fonction de l'API en fait, ne regarde qu'elle. Par contre ´n´ est tout autre chose.... Peut-etre faut-il avoir fait du Vb pour etre sensibilisé à cela.... à bon entendeur salut ! ;->
Et encore Merci à Remi, mon sauveur :o)
a+ Philippe
Remi Thomas wrote:
Salut,
Merci pour ta réponse, je suis entrain de réetudier l'option Event. Mais je pense qu'il y a 3 inconvénients:
1- est-ce praticable en vb6, ou vais-je bloquer l'appli jusqu'à ce qu'un evenement survienne ?
C'est le problème, il faut créer un thread qui attend. Facile en C, plus délicat en VB6
2- Lorsqu'un server declanche un évenement, est-ce que les X clients derrières seront informés de l'évenement, ou seulement le premier ?
Tous les clients sont abonnées
3- S'il faut un evenement par client, je ne sais jamais combien de client sont courament executés....
Pas besoin, l'exemple fonctionne avec autant de client que tu veux, dans la limite des ressources de la machine.