Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : AppIsRunning ou bien? [ Windows / Process ] (rvblog)

lundi 15 janvier 2007 à 16:21:50 | AppIsRunning ou bien?

rvblog

Membre Club
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?

rvblogn
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!


mardi 16 janvier 2007 à 14:53:51 | Re : AppIsRunning ou bien?

Renfield

Administrateur CodeS-SourceS
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

mardi 16 janvier 2007 à 14:54:29 | Re : AppIsRunning ou bien?

EBArtSoft

Administrateur CodeS-SourceS
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...

@+

[Code]E.B.[/Code]

mardi 16 janvier 2007 à 18:05:33 | Re : AppIsRunning ou bien?

rvblog

Membre Club
Salut Renfield, salut EBArtSoft,

merci pour ces idées.

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'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?).

rvblogn
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!


mardi 16 janvier 2007 à 19:15:46 | Re : AppIsRunning ou bien?

Renfield

Administrateur CodeS-SourceS

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

mardi 16 janvier 2007 à 20:54:30 | Re : AppIsRunning ou bien?

EBArtSoft

Administrateur CodeS-SourceS
Sinon FreeLibrary et on en parle plus :p. Non non je deconne ça ne libererait pas correctement la memoire.

@+

[Code]E.B.[/Code]

mardi 16 janvier 2007 à 21:09:08 | Re : AppIsRunning ou bien?

rvblog

Membre Club
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?

rvblogn
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!


mercredi 17 janvier 2007 à 06:52:18 | Re : AppIsRunning ou bien?

Renfield

Administrateur CodeS-SourceS

voici la doc qui m'avait permis d'utiliser GetObject, afin que mes clients attaquent toujours l'objet Serveur Actif...

[ Lien ]

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

Renfield
Admin CodeS-SourceS- MVP Visual Basic

mercredi 17 janvier 2007 à 08:08:43 | Re : AppIsRunning ou bien?

rvblog

Membre Club
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.

rvblogn
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!


mercredi 17 janvier 2007 à 12:08:48 | Re : AppIsRunning ou bien?

EBArtSoft

Administrateur CodeS-SourceS
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.

@+

[Code]E.B.[/Code]



Cette discussion est classé dans : version, question, exécutable, getmodulehandle, appisrunning


Répondre à ce message

Sujets en rapport avec ce message

Propriété VERSION d'un exécutable [ par HLM ] Je souhaite récupérer la version d'un exécutable avec VB4 soit avec une fonction existante soit avec une API Est-ce possible et comment? En-tête de question [ par alicvb ] Une petite suggestion en passant :Dans l'en-tête des question du forum, ce serait super d'avoir une indiquation sur la version de vb concerné (VB.net VBA, .NET variables et posters [ par ScSami ] Je n'ai que la version 2'000 de Office et il m'arrive souvent de répondre à des posts en VBA (Excel pour la plupart). Or, une question me hante... Est question pour ceux qui connaissent les differntes version d'Access urgent [ par bergamotte ] Hello !!!J'ai besoin de savoir comment remplacer Left$() et InsTr() et Mid$() et Trim sous Access XP. J'ai besoin de fonction qui font la meme chose q Question pour un champion... [ par galldup ] Salut à tous !J'utilise le code VB 6.0 pour exporter une requete Access (version 2000) vers Excel (version 97):ObjDb.DoCmd.TransferSpreadsheet acExpor Question Sur DIRECT X (toute version) [ par Alucard666 ] Bonjour,Serait il possible d'avoir une aide trésprecise sur Direct X et ses composant pour permettre une programmation poussée et optimiser.Car je n'a question sur le controle multimédia [ par elvis78 ] bonjour a tous.j'ai une petite question concernant le controle microsoft multimédia control.je l'ai utilisé pour lancer un fichier AVI,je lui ai donc MaJ VB.NET 2003 gratuit ! [ par guizmo123 ] Jibou jibou tout l'monde !Voilà, j'ai télécharger le Fram .NET 1.1 pour pouvoir utiliser le CSAgent...Et j'ai découvert que le SDK du .NET Framework 1 J'ose pas trop poser ma question sur une listbox [ par hqv0 ] Bonjour, alors voila, je debute en VB et je cale sur plein de trucs, mais la il y en a un qui ne veux pas s'eclaircir devant moi et je compte sur vo Exécutable lançant une page Web ... [ par yearling ] Bonjour à tous, en fait, j'ai créé une page PHP qui parcourt la base de données et envoie un mail à chaque client qui a son anniversaire. Seulement, j


Nos sponsors

Sondage...

CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.