【问题标题】:How to calling DLL procedure with parameters?如何调用带参数的DLL程序?
【发布时间】:2010-10-01 11:21:20
【问题描述】:

我在使用带参数的 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;

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

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

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

【问题讨论】:

    标签: delphi dll


    【解决方案1】:

    不应在赋值左侧使用指针符号 (@),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'));
    

    【讨论】:

    • 谢谢它一切都按照你说的方式工作。首先 Transfer 是一个过程,所以它不应该返回一个字符串: TTransferPtr = procedure (sMessage: PChar);标准调用。如果 Trans nil 工作,它需要一个指针地址:if @Trans nil。但除此之外,它是正确的。再次感谢
    • 啊,错了,我应该在发帖前先测试一下。
    • 如果 DLL 是在 D2009 之前编写的,则应用程序应使用 PAnsiChar 而不是 PChar 以确保在应用程序编写/升级到 D2009+ 时的兼容性。
    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 2013-07-14
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多