2010-10-01 6 views
1

J'ai des problèmes d'envoi en utilisant une procédure Dll avec des paramètres, je ne suis pas autorisé à ajouter des paramètres à l'appel de la méthode dll dans mon projet de test.Comment appeler la procédure DLL avec des paramètres?

Im essayant d'appeler cette méthode dll:

procedure Transfer(sMessage: PChar); stdcall; 
begin 
    MainForm.ShowThis(sMessage); 
end; 

exports 
Transfer; 

TestProj utilisant ceci:

procedure TForm1.Button1Click(Sender: TObject); 
var 
DLLHandle : THandle; 
begin 
    DLLHandle := LoadLibrary ('C:\Program Files\Borland\Delphi5\Projects\Dll\MyLink.dll'); 
    if DLLHandle >= 32 then 
     try 
       @Trans := GetProcAddress (DLLHandle, 'Transfer'); 
       if @Trans <> nil then 
        Trans //Would like to say something like: Trans('Hello') 
       else 
       Showmessage('Could not load method address'); 

     finally 
      FreeLibrary(DLLHandle); 
    end 
    else 
     Showmessage('Could not load the dll'); 
end; 

L'erreur de compilation que je reçois si j'utilise le "Trans ('Bonjour')" est: [Erreur] Unit1.pas (51): Trop de paramètres réels.

Je suis autorisé à l'exécuter sans les paramètres, mais je ne reçois jiberish dans ma boîte showmessage et un crash après, car je n'envoie aucun message. Donc, la question est comment puis-je envoyer une chaîne en tant que paramètre dans la DLL? Qu'est-ce que je fais mal ?

Répondre

1

Vous ne devriez pas utiliser le signe pointeur (@) sur le côté gauche de l'affectation, la variable Trans devrait ressembler à ceci:

type 
    TTransferPtr = procedure (sMessage: PChar); stdcall; 

var 
    Trans: TTransferPtr; 

// Then use it like this: 
Trans := TTransferPtr(GetProcAddress (DLLHandle, 'Transfer')); 
if @Trans <> nil then 
    Trans(PChar('Hello')); 
+0

Merci, il a travaillé allmost la façon dont vous Sayd. First of Transfer est une procédure donc il ne devrait pas retourner une chaîne donc: TTransferPtr = procedure (sMessage: PChar); stdcall. Et pour que Trans <> nil fonctionne, il doit être une adresse de pointeur: si @Trans <> nil. Mais autre alors que c'est juste. Merci encore – Roise

+0

Ah, désolé pour les erreurs, je devrais d'abord testé avant de poster. –

+0

Si la DLL est écrite en pré-D2009, l'application doit utiliser 'PAnsiChar' au lieu de' PChar' pour assurer la compatibilité si l'application est écrite/mise à niveau vers D2009 +. –

Questions connexes