Libérer CreateOleObject [Résolu]

cs_Tropic 90 Messages postés lundi 16 décembre 2002Date d'inscription 1 février 2011 Dernière intervention - 20 févr. 2008 à 07:09 - Dernière réponse : cs_Tropic 90 Messages postés lundi 16 décembre 2002Date d'inscription 1 février 2011 Dernière intervention
- 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 

6 réponses

Répondre au sujet
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 22 févr. 2008 à 17:15
+3
Utile
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 ?
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 22 févr. 2008 à 17:18
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 20 févr. 2008 à 09:54
0
Utile
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
cs_Tropic 90 Messages postés lundi 16 décembre 2002Date d'inscription 1 février 2011 Dernière intervention - 20 févr. 2008 à 10:19
0
Utile
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
cs_Tropic 90 Messages postés lundi 16 décembre 2002Date d'inscription 1 février 2011 Dernière intervention - 23 févr. 2008 à 06:52
0
Utile
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
cs_Tropic 90 Messages postés lundi 16 décembre 2002Date d'inscription 1 février 2011 Dernière intervention - 23 févr. 2008 à 06:57
0
Utile
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.