Delphi 如何使用参数调用DLL过程?

Delphi 如何使用参数调用DLL过程?,delphi,dll,Delphi,Dll,我在使用带有参数的Dll过程发送时遇到问题,我不允许在我的测试项目中向Dll方法的调用中添加参数 我正在尝试调用此dll方法: procedure Transfer(sMessage: PChar); stdcall; begin MainForm.ShowThis(sMessage); end; exports Transfer; TestProj使用以下方法: procedure TForm1.Button1Click(Sender: TObject); var DLLHandl

我在使用带有参数的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;
procedure TForm1.按钮1点击(发送方:TObject);
变量
德尔汉德尔:坦德尔;
开始
DLLHandle:=LoadLibrary('C:\ProgramFiles\Borland\Delphi5\Projects\Dll\MyLink.Dll');
如果DLLHandle>=32,则
尝试
@Trans:=GetProcAddress(DLLHandle,'Transfer');
如果@Trans nil那么
Trans//想说一些类似于:Trans('Hello')的话
其他的
Showmessage('无法加载方法地址');
最后
免费图书馆;
结束
其他的
Showmessage('无法加载dll');
结束;
如果我使用“Trans('Hello')”命令,我得到的编译错误是: [错误]单元1.pas(51):实际参数太多

我可以在没有参数的情况下运行它,但是我只会在我的showmessage框中得到jiberish,然后崩溃,因为我不发送任何消息


所以问题是如何将字符串作为参数发送到dll中?我做错了什么

不应在赋值的左侧使用指针符号(@),Trans变量应如下所示:

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'));
类型
ttTransferptr=程序(消息:PChar);stdcall;
变量
Trans:tttransferptr;
//然后像这样使用它:
Trans:=tttransferptr(GetProcAddress(DLLHandle,'Transfer'));
如果@Trans nil那么
Trans(PChar('Hello'));

不应在赋值的左侧使用指针符号(@),Trans变量应如下所示:

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'));
类型
ttTransferptr=程序(消息:PChar);stdcall;
变量
Trans:tttransferptr;
//然后像这样使用它:
Trans:=tttransferptr(GetProcAddress(DLLHandle,'Transfer'));
如果@Trans nil那么
Trans(PChar('Hello'));

谢谢,这一切都是按照你说的方式进行的。传输的第一步是一个过程,所以它不应该返回字符串,所以:ttTransferptr=procedure(sMessage:PChar);stdcall。要使if-Trans-nil正常工作,它需要一个指针地址:if@Trans-nil。但除此之外,这是正确的。感谢againAh,为错误感到抱歉,我应该在发布之前先测试它。如果DLL是在D2009之前编写的,那么应用程序应该使用
PAnsiChar
而不是
PChar
,以确保在将应用程序编写/升级到D2009+时的兼容性。非常感谢您所说的方法。传输的第一步是一个过程,所以它不应该返回字符串,所以:ttTransferptr=procedure(sMessage:PChar);stdcall。要使if-Trans-nil正常工作,它需要一个指针地址:if@Trans-nil。但除此之外,这是正确的。感谢againAh,为错误感到抱歉,我应该在发布之前先测试它。如果DLL是在D2009之前编写的,那么应用程序应该使用
PAnsiChar
而不是
PChar
,以确保在将应用程序编写/升级到D2009+时的兼容性。