Toya78
Messages postés44Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention23 août 2008
-
26 janv. 2008 à 11:35
Toya78
Messages postés44Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention23 août 2008
-
26 janv. 2008 à 17:33
Bonjour à tous,
Après avoir lu plusieurs articles sur les DLL et leur utilisation, je me retrouve face à un dilemne. J'ai lu qu'il existait un "conflit" entre String et PChar lors de l'appel de fonction de DLL et qu'il fallait utiliser ShareMem qui nécessitait le fichier borlndmm.dll.
Or je n'en suis pas encore à ce stade. Voici un code tout simple :
procedure TForm1.Button1Click(Sender: TObject);
var H : THandle;
begin
H := LoadLibrary('ma_dll.dll');
end;
Ce simple (et inutile) morceau de code me réclame borlndmm.dll (sur un PC sans Delphi). Aurais-je loupé quelque chose ?
Je précise que je compile sous Delphi 2007 et que la DLL en question contient 2 fonctions dont tous les paramètres sont des Integer (la DLL est compilée avec Visual C++).
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 26 janv. 2008 à 12:41
Salut,
voici ce que Delphi écrit en commentaire au début d'une nouvelle source de DLL :
{ Remarque importante concernant la gestion de mémoire de DLL : ShareMem doit
être la première unité de la clause USES de votre bibliothèque ET de votre projet
(sélectionnez Projet-Voir source) si votre DLL exporte des procédures ou des
fonctions qui passent des chaînes en tant que paramètres ou résultats de fonction.
Cela s'applique à toutes les chaînes passées de et vers votre DLL --même celles
qui sont imbriquées dans des enregistrements et classes. ShareMem est l'unité
d'interface pour le gestionnaire de mémoire partagée BORLNDMM.DLL, qui doit
être déployé avec vos DLL. Pour éviter d'utiliser BORLNDMM.DLL, passez les
informations de chaînes avec des paramètres PChar ou ShortString. }
dans ton cas tu peux supprimer ShareMem de la Clause Uses de ta DLL et de ton projet.
Et si la DLL exporte des procédures ou des fonctions qui passent des chaînes en tant que paramètres ou résultats de fonction.
Il te faut fournir BORLNDMM.DLL avec ton application ...
tu trouveras cette DLL dans le répertoire Bin de ton Delphi.
Toya78
Messages postés44Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention23 août 2008 26 janv. 2008 à 15:02
Oui Cirec je l'avais vu. Mais justement mon exemple n'appelle aucune fonction de DLL avec des String (il n'appelle même rien du tout) il fait juste un LoadLibrary. Il n'y a aucune autre ligne de code dans l'implémentation. Et pourtant on me demande BORLNDMM.DLL lorsque je fais le LoadLibrary... ce que je ne comprends pas...
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 26 janv. 2008 à 16:46
as-tu le source de la DLL
ou les déclarations des deux fonctions ...
parce que ton histoire ne me parait pas très logique ... Bon en même temps je n'ai aucune connaissance en visual C++ Mais histoire d'essayer de comprendre le pourquoi du comment.
@+
Cirec
<hr siz="" />
Vous n’avez pas trouvé la réponse que vous recherchez ?
Toya78
Messages postés44Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention23 août 2008 26 janv. 2008 à 17:01
Je n'ai pas la source malheureusement... la DLL n'étant pas de moi. La DLL contient 2 fonctions (d'après tdump). La DLL sert à décompresser/compresser des fluxs en compression LZS.
Je ne connais qu'une seule des déclarations :
function Compress(Src : Pointer; SrcLen : Integer; Dst : Pointer; var DstLen : Integer) : LongBool
L'autre fonction est Decompress. Je ne connais pas sa déclaration (aucune doc. avec la DLL) mais je suppose que ça ressemble à Compress (en tout cas, pas de String dans les environs).
Je sais que c'est bizarre qu'il me demande BORLNDMM.DLL alors que je n'utilise pas de String et encore moins l'unité Sharemem... J'aimerais bien comprendre et ne plus avoir besoin de ce BORLNDMM.DLL...
Toya78
Messages postés44Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention23 août 2008 26 janv. 2008 à 17:14
Je viens de faire quelques tests : j'ai créé sous Delphi une DLL contenant une fonction Somme(A, B : Integer).
Avec elle aucun problème : BORLNDMM.DLL n'est pas réclamé du tout lorsque je fais le LoadLibrairy.
J'en déduis donc que ça vient de la DLL écrite sous Visual C++... Dommage que je n'aie rien lu là-dessus.
Toya78
Messages postés44Date d'inscriptionvendredi 1 septembre 2006StatutMembreDernière intervention23 août 2008 26 janv. 2008 à 17:25
Je viens de tester la DLL enquiquinante en la chargeant de manière statique. Aucune erreur si je ne mets pas d'appel de fonction. Par contrôle problème au démarrage si j'écris un appel de sa fonctin : on me demande BORLNDMM.DLL...