AppIsRunning ou bien?

rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 - 15 janv. 2007 à 16:21
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 - 17 janv. 2007 à 12:08
Bonjour à toutes et à tous,

et Meilleurs Voeux pour 2007 à celles et ceux à qui je ne les ai pas encore souhaités!

J'ai cherché sur VBF, et j'ai trouvé des réponses, en rapport avec le domaine, mais pas en rapport direct avec ma question (il y a bien un AppIsRunning, mais avec des handle de fenêtres), ni de cas vraiment similaires. J'ai hésité avant de poster dans ActiveX COM, mais au vu de la question, j'ai préféré m'adresser aux "calés" de l'API process (quoi? pas de calais?:))

Le contexte de la question est le suivant :
Windows 2000 pro, VB6 SP6 (merci PCPT:)).
- Un exécutable VB charge des extensions (dll ActiveX VB), par le biais de la fonction CreateObject(modModule.ProgID).

Dans le cadre de l'implémentation d'un LiveUpdate, l'exécutable s'apprête à remplacer la version courante d'une extension par une autre version.
Pour cela, il demande, via une interface, à l'extension de s'arrêter (elle libère toutes ses références internes/externes, et l'exécutable fera de même pour celles concernées).
Une fois ceci fait, et une fois le contexte rétabli pour l'utilisation de la nouvelle version (déregistration/archivage de l'ancienne, installation/registration de la nouvelle), il demande à la nouvelle de démarrer.

Pour m'assurer que je peux déregistrer/archiver l'ancienne version, et installer/registrer la nouvelle version, j'utilise (le split, c'est pour faire bref) (si si, là, je suis bref:)GetModuleHandle(Split(modModule.ProgID,".",-1)(0)) dans une boucle While/Wend (avec un timeout).

Or, lorsque j'exécute au pas à pas, GetModuleHandle finit par me retourner 0 pour me signifier que le module est déchargé (je le vérifie au ProcessExplorer), mais lorsque j'exécute la portion de code d'un coup, je déclenche mon timeout car GetModuleHandle ne me renvoie pas 0 (il arrive que ProcessExplorer ne se rafraichisse pas tout de suite non plus). J'ai bien rajouté (en désespoir de cause) un DoEvents ou un Sleep, mais rien n'y fait (je précise que mon processeur n'a rien d'un processeur stressé par le boulot, voire même qu'il a largement de quoi prêter son temps au projet CPUShare:)).

Ma question est la suivante :
Y-t-il, dans le guide des bonnes pratiques non documentées de l'API, une (ou plusiers centaines de:)) fonction(s) à appeler entre 2 interrogations GetModuleHandle (avant, après, en même temps, ou même dans une autre dimension...:)), pour voir le résultat de celle-ci mis à jour par l'OS avant mon timeout (approximativement, et de façon définitivement temporaire, de 2s)?

à+
PS : y-a-t-il plus simple (et plus efficace) que GetModuleHandle?

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>

9 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
16 janv. 2007 à 14:53
tu pourrais peut être ajouter ton objet a la ROT (Running Object Table), et tenter de la retrouver via GetObject...
Si GetObject renvoie un objet, c'est que ton objet tourne....

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
16 janv. 2007 à 14:54
Peut être que des appels intempestif à GetModuleHandle bloque le dechargement du module. Si l'ensemble des module sont intrinseque a ton projet il n'est peut etre pas necessaire d'appeler GetModuleHandle. Tu peux surement testé si le fichier dll ou ocx est effacable. Car du coup cela signifie que le module est totalement dechargé.

à voir...

@+

E.B.
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
16 janv. 2007 à 18:05
Salut 2359 Renfield, salut =15669 EBArtSoft,

merci pour ces idées.

2359 Renfield, pour une raison que j'ignore encore, GetObject(,modModule.ProgID) n'arrive pas à récupérer l'instance existante (pendant que je suis sûr qu'elle existe, et lui de me dire "429 blabla"), peut-être à cause du transtypage de l'interface que je ne fais pas (peu de temps, là tout de suite), et GetObject("",modModule.ProgID) me crée une 2ème instance (c'est d'ailleurs sûrement ce qu'essaye de m'expliquer MSDN).

J'irais sûrement aussi investiguer la piste d'=15669 EBArtSoft, sur l'"effaçabilité" de la dll, mais il faudra auparavant que je passe par codyx pour trouver un snippet qui me permet d'éprouver cette "effaçabilité", mais sans l'accomplir.
En effet, je souhaite laisser cela à mes fichiers *.inf, car chaque extension a son lot de composants externes (parfois partagés), et lorsque la phase de désinstallation échoue (raison x, y liée au LiveUpdate/Downdate à partir du ftp ou du local), je souhaite redémarrer l'extension.

Par contre, pour faire avancer le débat, oui, je sollicite trop GetModuleHandle. Mais si je l'appelle une fois, il me retourne un handle (donc pas 0), et si je le laisse tranquille pendant environ 30 secondes, et que je le rappelle, il finit par me retourner 0 (tant attendu, mais j'aimerais bien ne pas avoir à attendre, c'est pour cela que je le sollicite). De la même façon, ProcessExplorer me signale le module chargé pendant un certain temps après que j'ai fait le nécessaire pour le décharger (toujours au pas à pas sous VB), puis, pendant que j'écrase mon café tout en remuant ma cigarette, il me notifie du déchargement du module. Et parfois même, à ce point là, GetModuleHandle n'est encore tout à fait au courant (environ 2 s après).

Je n'ai pas encore comparé cette phase de déchargement entre toutes mes extensions, celle que j'utilise pour la conception du LiveUpdate ne fait rien de spécialisé, mais elle a en commun avec les autres extensions tout ce qui va de paire avec l'interface (des skins fonds d'écrans et boutons, des thèmes, un modèle User, une Connexion DB locale, des notifications dans les 2 sens... du basique quoi), et j'émets l'hypothèse que le temps de déchargement réel de toutes ces broutilles est peut-être la raison de mon attente après le GetModuleHandle. Ceci dit, je ne m'y connais pas assez en programmation Windows pour savoir si cela a vraiment une influence sur le déchargement.

merci à vous 2, je vous tiens au courant,
à+

PS: pour l'instant, sans pas à pas, cela fonctionne, mais en 2 fois. Une fois, je tente le changement de version (up ou down), il n'arrive souvent qu'à m'arrêter le module (et oui, parfois cela marche du 1er coup, ce qui finit par être, paradoxalement, agaçant). La 2ème fois part d'un module absent, et fonctionne impéccablement (donc je ne suis pas encore dans l'embarras total). Mais je me demande si, finalement, je ne vais pas finir par utiliser une source VBF (trouvée par bon hasard, mais dont je n'ai plus l'URL sous la souris) qui donnait les clés pour créer les objets soit même, et les releaser soit même (je ne sais même pas si ce n'est pas un de vous 2, l'auteur, ou alors ShareVB?).

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
16 janv. 2007 à 19:15
GetObject(, ...... )   utilise la ROT .... faut inscrire ton objet dedans manuellement pour que cela fonctionne...

je m'en suis déjà servi, avec un Exe ActiveX

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
16 janv. 2007 à 20:54
Sinon FreeLibrary et on en parle plus :p. Non non je deconne ça ne libererait pas correctement la memoire.

@+

E.B.
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
16 janv. 2007 à 21:09
j'adore le genre de terminaison que FreeLibrary donne sur mes dll :) (pour libérer, ça libère).

par contre MSDN mentionne la Rot Support Type Definition (ROTTypes.tlb) et la ROT Support Object (ROTHook.dll), une idée d'où elles se trouvent?

il en y a-t-il d'autres équivalentes?

et puis Renfield, tu implémentes l'inscription/désinscription à la ROT du côté du client, hein?

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
17 janv. 2007 à 06:52
voici la doc qui m'avait permis d'utiliser GetObject, afin que mes clients attaquent toujours l'objet Serveur Actif...

http://www.ftponline.com/Archives/premier/mgznarch/vbpj/1997/08aug97/bbelt.pdf

Ensuite, si GetObject échouais, j'instanciais mon objet...
pour les prochains clients, le GetObject fonctionnera....

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
17 janv. 2007 à 08:08
Salut Renfield,

bien vu, le monde appartient à ceux qui se lèvent tôt :)

Il y a la même dans le MSDN, se pose toujours la question de cette dll (ROTHook.dll) et de sa bibliothèque de types.

Par contre, je suis tombé sur une de tes sources (http://www.vbfrance.com/codes/AJOUTEZ-PLUGINS-DANS-VOTRE-PROGRAMME_34980.aspx)où tu inscris à la main, je vais tester (j'ai un peu peur que le WaitForSingleObject ne me convienne pas, mais je verrais).

bonne journée.

rvblog<sup>n
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!</sup>
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
17 janv. 2007 à 12:08
GetObject sert surtout pour les instance externe. Dans ton cas si c'est des "plugins" il suffit de faire Set MonObjet = Nothing puis FreeLibrary (a conditions d'avoir bien liberer toute les instances de l'objet). Car si tu l'inscrit dans la ROT tu l'expose aux autres application et cela peut te jouer des mauvais tours.

@+

E.B.
0
Rejoignez-nous