Libérer CreateOleObject [Résolu]

Messages postés
90
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
1 février 2011
- - Dernière réponse : cs_Tropic
Messages postés
90
Date d'inscription
lundi 16 décembre 2002
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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
11
3
Merci
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 ?

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 114 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
11
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 114 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_rt15
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
1
0
Merci
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 ?
Commenter la réponse de florenth
Messages postés
90
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
1 février 2011
0
Merci
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
Commenter la réponse de cs_Tropic
Messages postés
90
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
1 février 2011
0
Merci
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
Commenter la réponse de cs_Tropic
Messages postés
90
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
1 février 2011
0
Merci
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
Commenter la réponse de cs_Tropic

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.