【问题标题】:Properly call external dll in Delphi?在Delphi中正确调用外部dll?
【发布时间】:2015-01-01 19:25:02
【问题描述】:

我对 Delphi 的基本了解很少(事实上我已经使用了几年了)...

我用 DLL 碰壁了(从来没有真正玩过这个)。

考虑这个例子:

   unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

Type FT_Result = Integer;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  FT_HANDLE : DWord = 0;



implementation

{$R *.dfm}

function I2C_GetNumChannels(numChannels: dword):FT_Result; stdcall; external 'libmpsse.dll' name 'I2C_GetNumChannels';
function I2C_OpenChannel(index:dword;handle:pointer):FT_Result; stdcall; external 'libmpsse.dll' name 'I2C_OpenChannel';

procedure TForm1.Button1Click(Sender: TObject);
var
numofchannels:dword;
begin
i2c_getnumchannels(numofchannels);
showmessage(inttostr(numofchannels));
end;

end.

我需要从 FTDI 连接 libmpsse.dll 以访问 USB 端口上的 I2C 设备。
当我调用函数 I2C_GetNumChannels 时,我得到了大量的 AccessViolation...

我只是想知道dll函数出了什么问题?

I2C_GetNumChannels 也应该返回 2 个值...

来自官方 API 指南 -->http://www.ftdichip.com/Support/Documents/AppNotes/AN_177_User_Guide_For_LibMPSSE-I2C.pdf

非常感谢!

问候

【问题讨论】:

  • numChannels 是指向 DWORD 而不是 DWORD 的指针。你的函数声明是错误的。
  • 我已经相应地更正了代码...谢谢!

标签: delphi dll usb i2c ftdi


【解决方案1】:

您的翻译不正确。应该是:

function I2C_GetNumChannels(out numChannels: Longword): FT_Result;
  stdcall; external 'libmpsse.dll';

您正在调用的函数接受 32 位无符号整数的地址。您的翻译按值传递了一个 32 位无符号整数。

您可以使用指针翻译导入,但调用者使用varout 参数更容易,就像我所做的那样。

我假设您已正确确定调用约定是stdcall。您需要检查头文件才能确定。

您应该检查从函数调用返回的值是否有错误。这是人们在调用外部库时最常犯的一个错误。不要忽略返回值。检查错误。

【讨论】:

  • 你是对的!谢谢先生切换到CDECL(stdcall正在创建访问冲突)
  • 函数 I2C_GetNumChannels(out numChannels: Longword): FT_Result;cdecl;外部'libmpsse.dll';是正确的答案
  • 这可能是正确的,但不要使用反复试验。签入头文件。
  • 我只有一个C头文件...我在哪里找?
  • 关于调用约定,以及如何确定,请阅读我的文章Pitfalls of converting。它解释了很多关于标题翻译的内容。
猜你喜欢
  • 1970-01-01
  • 2016-01-10
  • 2023-01-07
  • 1970-01-01
  • 2019-08-05
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多