Libérer CreateOleObject

Résolu
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011 - 20 févr. 2008 à 07:09
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011 - 23 févr. 2008 à 06:57
J'ai une procédure pour savoir si une DLL est enregistrée
mais je narrive pas à la libérer par la suite

Je précise que c'est une procédure Inno Setup, mais comme c'est du Delphi

Voila comment savoir si une DLL est enregistrée

Var objPlugIn : Variant;
objPlugIn := CreateOleObject('PlugExt.' + sName);

sName est le nom de la classe de la DLL
Si a ce moment, il n'y as pas d'erreur, c'est quelle est enregistrée

Et je voudrais la libérer

objPlugIn := unassigned; //Ne fonctionne pas
objPlugIn.free();     //Ne fonctionne pas

JE NE METRISE PAS DELPHI

Merci
mjm

6 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 févr. 2008 à 17:15
Salut,


Le COM est un drôle de truc pas drôle du tout à utiliser.

Quand on écrit ça :

objPlugIn := unassigned;

on se dit qu'on perd l'objet dans l'espace. Fin du moi c'est ma logique...

On avait un pointeur sur un objet, on fait pointer sur rien -> on a perdu l'objet.

C'est généralement une faute grave en Delphi.


Seulement voilà...

En faisant ça, Delphi va décrémenter un compteur de référence de
l'objet (Nombre de pointeurs sur cette objet), et si le compteur tombe
à zéro, l'objet sera libéré. Ca veut aussi dire que le compteur a été
incrémenter à 1 sans qu'on le voit. L'utilisation de COM fait donc que
delphi génère beaucoup plus de code que d'habitude sans nous prévenir.


InnoSetup n'utilise pas un compilo de Delphi, et ce n'est pas dit qu'il gère le COM de la même manière.


L'objet COM implémente par définition IUnknown,
et tu pourrais essayer de diminuer son compteur de référence à l'aide
de la méthode Release. Cependant, ce n'est pas dit que cela
fonctionne...


Epluche la doc de Inno Setup : s'il propose cette fonction, c'est qu'elle a été testée.


Autre chose : ton problème (Installation d'une dll COM potentiellement
déjà existante) est plutôt courant pour une installe... Le flag
regserver ne te suffit pas ?
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 févr. 2008 à 17:18
Argh, j'oubliais...


Tu peux regarder dans la base de registre pour savoir si une dll COM est déjà registrée...

Le processus de registration est plus ou moins détaillé ici.
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
20 févr. 2008 à 09:54
Salut !

Un petit bonjour n'a jamais fait de mal, non ?
Sinon, pour ma part, j'ai toujours utilisé objPlugIn := UnAssigned et je n'ai jamais eu de problèmes.

As-tu un message d'erreur ou un truc du genre ?
0
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
20 févr. 2008 à 10:19
Salut !

Nom pas de message d'erreur.C'est juste que lors de l'installation
la DLL est occupée, donc pas possible de la remplacer

si je désactive cette ligne objPlugIn := CreateOleObject('PlugExt.' + sName);
ok la DLL est remplacée
mais voila j'ai besoin de savoir si elle était activée
pour faire un RegisterServer() ou PAS

voila à quoi la ligne dans INNOSETUP
Source: nane.dll; DestDir: {app}\plugins\; Flags: ignoreversion; BeforeInstall: IsPlugInReged; AfterInstall: RegedPlugIn (1);

***lors du  BeforeInstall (activer avant la copie de la DLL)
une procedure IsPlugInReged vérifie si la  DLL est enregistrée

*** LA DLL est copiée (CreateOleObject n'as pas libéré la DLL)

***après AfterInstall  (activer aprèsla copie de la DLL)
une procedure RegedPlugIn enregistre ou pas la  DLL

Merci
mjm
0

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

Posez votre question
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
23 févr. 2008 à 06:52
Salut,

Merci rt15.
Très bonne idée, d'autant que je l'ai déjà pratiqué.
EBArtSoft donne un exemple concret pour trouver la CLASSID,
mais je sais plus le lien.

Maintenant, il faut la transposer en DELPHI
mjm
0
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
23 févr. 2008 à 06:57
Le flag regserver ne te suffit pas ?

Juste pour dire que regserver va enregistrer ma dll systématiquement.
Pour une INSTALL ok, mais pour une mise à jour ???

Les DLLs en question sont des bouts de prog q'on active ou pas.

mjm
0
Rejoignez-nous