Problème de chargement de DLL

Toya78 Messages postés 44 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 août 2008 - 26 janv. 2008 à 11:35
Toya78 Messages postés 44 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 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++).
A voir également:

9 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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.

 
@+
Cirec

<hr siz="" />
0
Toya78 Messages postés 44 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 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...
0
Toya78 Messages postés 44 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 août 2008
26 janv. 2008 à 15:03
J'ajoute que Sharemem n'apparaît pas dans ma clause Uses bien évidemment.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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="" />
0

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

Posez votre question
Toya78 Messages postés 44 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 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...
0
Toya78 Messages postés 44 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 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.
0
Toya78 Messages postés 44 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 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...
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
26 janv. 2008 à 17:31
Désolé mais à part fournir BORLNDMM.DLL avec ton application je n'ai aucune autre solution à te proposer

 
@+
Cirec

<hr siz="" />
0
Toya78 Messages postés 44 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 août 2008
26 janv. 2008 à 17:33
Tant pis Cirec. Je crois en effet que ça risque d'être difficile.
Merci quand même d'avoir pris le temps de me lire :)
0
Rejoignez-nous