2010-10-01 15 views
1

我必须使用带有参数的DLL过程发送的问题,即时通讯不允许参数添加到dll的方法在我的测试项目呼叫。如何使用参数调用DLL过程?

我试着去调用这个DLL的方法:使用

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

exports 
Transfer; 

TestProj这样的:

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; 

编译错误我得到,如果我用的是 “跨( '你好')” 是: [错误] Unit1.pas(51):太多的实际参数。

进出口允许无参数运行,但然后我只得到jiberish我showmessage框和后崩溃,因为我不发送任何消息。

所以,问题是我如何去发送一个字符串作为参数传入的dll?我究竟做错了什么 ?

回答

1

你不应该在分配的左侧使用指针符号(@),横贯变量应该是这样的:

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

由于它的allmost工作你sayd的方式。第一传送是一个过程,以便它不应该返回一个字符串,以便:TTransferPtr =过程(sMessage:PChar类型); STDCALL。如果Trans <>无效,它需要是一个指针地址:if @Trans <> nil。但其他的那是正确的。再次感谢 – Roise 2010-10-01 11:52:08

+0

啊,遗憾的错误,我应该先在发布前进行了测试。 – 2010-10-01 12:18:19

+0

如果DLL被写入预D2009,然后应用程序应使用的'PAnsiChar'代替'PChar'以确保兼容性,如果应用程序被写入/升为D2009 +。 – 2010-10-04 23:44:57

相关问题