2010-02-22 7 views
0

Étant donné que j'ai eu beaucoup de mal à utiliser les DLL, j'ai décidé d'essayer les paquets d'exécution (principalement pour éviter le gestionnaire de mémoire et les problèmes de registre de type).Gestion de la mémoire des paquets

De ma demande je fais quelque chose comme ceci:

HandleList := TList <THandle>.Create; 
try 
    PackageObj.DoSomething (HandleList); 
finally 
    FreeAndNil (HandleList); 
end; 

La méthode (à l'intérieur du paquet d'exécution) ajoute quelque chose à la liste:

procedure TPackageObject.DoSomething (HandleList: TList <THandle>); 
begin 
    HandleList.Clear; 
    HandleList.Add (0); 
end; 

Je reçois Invalid Pointer exception soit dans la appelez au Clear dans le paquet ou dans l'appel à FreeAndNil dans l'application. Les violations d'accès se produisent également de temps en temps. Lors de l'utilisation de FastMM, il est parfois indiqué que "l'en-tête du bloc a été corrompu".

L'erreur se produit toujours lorsque la mémoire est allouée ou libérée, c'est-à-dire en ajoutant quelque chose à la liste et en provoquant ainsi une croissance dynamique de la liste.

Est-ce que la façon dont l'objet HandleList est transmis au paquet et de retour est correcte? Y a-t-il quelque chose d'important à savoir sur les paquets et la gestion de la mémoire? Ou l'erreur doit-elle être ailleurs?

EDIT Dans le cas où l'erreur est susceptible d'être ailleurs, comment suis-je supposé déboguer quelque chose comme ça? Des expériences?

+0

C'est correct et aucun problème n'est à prévoir. A moins que le truc générique te joue des tours. Quelle version de Delphi utilisez-vous et comment avez-vous configuré FastMM? –

+0

J'utilise D2010 et FullDebugMode de FastMM. – jpfollenius

Répondre

3

Je suppose que vous compilez le même code dans différents paquets, peut-être aussi dans l'exécutable de l'application. Que vous liez vos paquets d'exécution de manière statique (en les listant dans les options du projet) ou dynamiquement (en utilisant LoadPackage), chaque unité doit être liée dans un seul module, sinon vous aurez des conflits de code en double. Vérifiez vos dépendances de package (clauses requires), liste des packages d'exécution dans les options de projet principales, consultez les avertissements du compilateur sur les unités incluses implicitement.

+0

Donc, est-ce que c'est faux d'avoir une unité 'CommonStuff' dans les paquets' contains' et dans l'application? Quelle est l'alternative? Je ne sais pas si je comprends parfaitement votre réponse. Peut-être que vous pouvez l'expliquer dans un peu plus de détails. Merci! – jpfollenius

+2

Vous pouvez utiliser l'unité dans l'application, mais le projet doit utiliser le package d'exécution qui le contient, sinon vous reliez l'unité dans l'exécutable. Si vous utilisez plus de paquets, chaque unité doit être dans un seul paquet (clause contains). Tout autre package utilisant la même unité doit référencer le package d'origine (clause requires). –

+0

Merci pour votre aide! Je l'ai fonctionné maintenant. +1 et accepté – jpfollenius