cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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 ?
cs_Tropic
Messages postés90Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Tropic
Messages postés90Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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.