Page 1 sur 1
[R] Retrouver le chemin d'enregistrement d'une DLL
Posté : mer. 08 sept. 2010 17:51
par sksbir
Bonjour
Je cherche à savoir si une DLL est enregistrée.
Pour enregistrer une DLL, il suffit d'utiliser regsvr32.exe <fichier DLL>
Le hic, c'est que regsvr32.exe n'a pas d'option du genre "query" pour savoir si l'enregistrement est déja effectué ou pas.
J'ai trouvé
cette page et
cette page qui donnent des exemple
de programme capables
de faire ça, mais je ne vois pas trop comment ça fonctionne.
Par ailleurs, j'ai trouvé
cet exemple sur le forum autoit anglais, mais il faut installer une autre DLL pour que ça fonctionne , ou alors selon un autre exemple dans la meme page, utiliser une fonction _DLLRegisterServer qui s'avère être inexistante dans la doc standard d'autoit...
Si quelqu'un pouvait me donner une piste, ça serait sympa. Merci
Re: [..] Retrouver le chemin d'enregistrement d'une DLL
Posté : mer. 08 sept. 2010 23:06
par Tlem
Si vous ne voulez pas passer par un utilitaire tiers, je pense que la solution sera de lister toutes les DLL enregistrées dans la base de registre dans les sous clés de HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID
Par exemple, pour la DLL dao32.dll, il me suffit de lire la valeur de chaine par défaut de la clé HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000010-0000-0010-8000-00AA006D2EA4}\InprocServer32 et le tour est joué.
Re: [..] Retrouver le chemin d'enregistrement d'une DLL
Posté : jeu. 09 sept. 2010 10:26
par sksbir
Merci pour la réponse rapide

J'avais déjà vu cette proposition en parcourant internet.
Sur mon PC, cette entrée
de registre pointe sur DAO350.DLL
Par ailleurs, si je recopie cette DLL par exemple sur D:\tmp, et que je passe la commande regsvr32 d:\tmp\dao350.dll, alors l'entrée
de registre HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000010-0000-0010-8000-00AA006D2EA4}\InprocServer32 ne reflète pas le changement
Par contre, l'entrée
de registre HKEY_CLASSES_ROOT\CLSID\{00000010-0000-0010-8000-00AA006D2EA4}\InprocServer32 reflète bien ce changement, c'est à dire que je vois bien la valeur D:\tmp\DAO350.DLL , et non plus c:\program files\...
Et puis il y a encore HKEY_CURRENT_USER\Software\Classes\CLSID, avec apparemment le même train
de clés
de registres , mais des valeurs différentes.
C'est ce genre d'incertitude qui me fait toujours hésiter à utiliser le
registre directement.
Je vais toutefois continuer à gratter cette piste.
Re: [..] Retrouver le chemin d'enregistrement d'une DLL
Posté : jeu. 09 sept. 2010 11:46
par sksbir
Voici une autre approche qui fonctionne et que je pense que je vais retenir.
► Afficher le texteCode autoit
Code : Tout sélectionner
; http://msdn.microsoft.com/en-us/library/ms679228%28v=VS.85%29.aspx
; http://docwiki.embarcadero.com/VCL/fr/CmAdmCtl.TCOMAdminCatalogCollection
; http://www.servernewsgroups.net/scripting/t12167-howto-determine-dll-registered.aspx
; http://msdn.microsoft.com/en-us/library/ms688526%28v=VS.85%29.aspx ( pour les mots clés derriere $APPOBJECT )
$CATALOG=ObjCreate("COMAdmin.COMAdminCatalog")
$APPLICATION=$CATALOG.GetCollection("InprocServers")
$APPLICATION.Populate()
For $APPOBJECT In $APPLICATION
MsgBox(0,"test",$APPOBJECT.Name)
MsgBox(0,"test2",$APPOBJECT.Key)
MsgBox(0,"test3",$APPOBJECT.Valid)
MsgBox(0,"test4",$APPOBJECT.Value("InprocServer32") )
MsgBox(0,"test5",$APPOBJECT.Value("CLSID") )
MsgBox(0,"test6",$APPOBJECT.Value("ProgID") )
Next
Re: [R] Retrouver le chemin d'enregistrement d'une DLL
Posté : jeu. 09 sept. 2010 19:56
par Tlem
La problématique reste, car ce code ne fait que lire les objets (entrées
de la
base de registre) du CLSID et donc vous aurez le même problème que dans votre exemple précédent, tant que vous n'aurez pas dés-enregistré 'l'ancienne DLL'.
Cela dit, le code sera probablement moins long avec ce code que l'utilisation des fonctions
RegRead & CO.
