Pb de libération de Dll

padsou Messages postés 121 Date d'inscription jeudi 24 janvier 2002 Statut Membre Dernière intervention 13 avril 2010 - 27 sept. 2005 à 16:52
bv94 Messages postés 40 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 16 décembre 2006 - 5 oct. 2005 à 12:42
Bonjour !

J'ai un souci : Je libère ma Dll et quand je ferme mon application j'ai une erreur "opération de pointeur incorrecte". Si je ne la libère pas je n'ai pas ce message. voici mon code :

procedure CloseLinkDll;
var
hDll: THandle;
begin
if fileexists('madll.dll') then
begin
hDll := LoadLibrary(pAnsiChar('madll.dll'));
if hDll = 0 then
Exit;
FreeLibrary(hDll);
end;
end;

Merci !

5 réponses

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
28 sept. 2005 à 09:56
Hello,



Je pense que cela provient de ta dll elle même car se code me semble correct. Donne nous le code de ta dll pour voir.

Bonne prog,
JMP77.

N'oubliez pas de cliquer sur réponse acceptée.
0
padsou Messages postés 121 Date d'inscription jeudi 24 janvier 2002 Statut Membre Dernière intervention 13 avril 2010
28 sept. 2005 à 11:16
Merci de t'interesser à mon probleme !

function Init(Repertoire: string): boolean;
begin
try
OnProcessing := 0;
FileConf := TIniFile.Create(Repertoire + 'preprocess.ini');
Repertoire := FileConf.ReadString('PATH', 'DELTA', '') + '\';
CherStringList := TStringList.Create;
GroupeMessageList := TStringList.Create;
DataModule1 := TDataModule1.Create(nil);
DataModule1.ADOConnection1.Connected := True;
finally
Result := DataModule1.ADOConnection1.Connected;
end;
end;


function CloseDll: boolean;
begin
try
DataModule1.ADOQuery1.Close;
DataModule1.ADOTable1.Close;
DataModule1.ADOTable2.Close;
DataModule1.ADOConnection1.Connected := False;
if FileConf <> nil then
FreeAndNil(FileConf);
if CherStringList <> nil then
FreeAndNil(CherStringList);
if GroupeMessageList <> nil then
FreeAndNil(GroupeMessageList);
if DataModule1 <> nil then
FreeAndNil(DataModule1);
finally
Result := True;
end;
end;
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
2 oct. 2005 à 08:40
Déjà, je commencerais par modifier le code pour éviter de renvoyer vrai dans tous les cas car, sinon, à quoi cela servirait-il de créer une fonction ?

function CloseDll: boolean;
begin
try
DataModule1.ADOQuery1.Close;
DataModule1.ADOTable1.Close;
DataModule1.ADOTable2.Close;
DataModule1.ADOConnection1.Connected := False;
if FileConf <> nil then
FreeAndNil(FileConf);
if CherStringList <> nil then
FreeAndNil(CherStringList);
if GroupeMessageList <> nil then
FreeAndNil(GroupeMessageList);
if DataModule1 <> nil then
FreeAndNil(DataModule1);
Result := True;
Except
Result := False;
end;
end;

Lors du chargement de la DLL dans l'application principale, pourquoi ne pas conserver le handle de la librairie dans une variable globale ? Ainsi, au moment de la fermeture, il suffit de passer le même Handle lors de l'appel à CloseLibrary :
procedure CloseLinkDll;
begin
if hDll <> 0 then
FreeLibrary(hDll);
end;

Je note aussi que dans la ligne : hDll := LoadLibrary(pAnsiChar('madll.dll'));
la conversion en PAnsiChar est superflue


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
padsou Messages postés 121 Date d'inscription jeudi 24 janvier 2002 Statut Membre Dernière intervention 13 avril 2010
3 oct. 2005 à 09:30
certes mais ceci n'était qu'un erzatz de code. Je l'ai modifié depuis, en passant notamment le handle en variable globale mais rien n'y faisait jusqu'à ce week end où je décide de passer l'appel de la Dll en mode statique. Merci quand même de vos remarques !
0

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

Posez votre question
bv94 Messages postés 40 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 16 décembre 2006 1
5 oct. 2005 à 12:42
Pour utiliser des dll, il faut declarer Sharemem dans la clause units de ton projet et de ta dll.
Elle doit être la première des unités déclarées.

Bon courage.

BV94
0
Rejoignez-nous