使用 Delphi 使用 C dll

标签 c delphi dll freepascal lazarus

我有一个带有此签名的 Dll 函数:

UInt32 Authenticate(uint8 *Key);

我在 Delphi 上这样做:

function Authenticate(Key:string) : UInt32; external 'mylib.dll' name 'Authenticate';

但总是,函数返回 10(错误代码)并且应用程序停止:\

有办法做到这一点吗?

更新: 谢谢大家!你是最棒的!

最佳答案

您的代码存在一些问题。

1) uint8 相当于 Delphi 中的 Byte,而不是 String

2) C 代码使用编译器的默认调用约定,通常是__cdecl。另一方面,Delphi 的默认调用约定是 register。它们彼此不兼容。如果调用约定不匹配,则在运行时函数调用期间将无法正确管理堆栈和 CPU 寄存器。

C 代码的字面翻译应该是这样的:

function Authenticate(Key: PByte) : UInt32; cdecl; external 'mylib.dll';

但是,假设该函数实际上需要一个以 null 结尾的字符串,那么改为这样做:

// the function is expecting a pointer to 8-bit data,
// so DO NOT use `PChar`, which is 16-bit in Delphi 2009+...
function Authenticate(Key: PAnsiChar) : UInt32; cdecl; external 'mylib.dll';

我会坚持使用第一个声明,因为它与原始 C 代码相匹配。即使该函数需要一个以 null 结尾的字符串作为输入,您仍然可以通过类型转换使用 PByte 将其传递:

var
  S: AnsiString;
begin
  Authenticate(PByte(PAnsiChar(S)));
end;

或者,如果函数允许空字符串输入 NULL:

var
  S: AnsiString;
begin
  Authenticate(PByte(Pointer(S)));
end;

关于使用 Delphi 使用 C dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11787669/

相关文章:

delphi - 如何修复 Nevrona Rave 中的无限打印循环错误

c++ - 在 Delphi 中使用 C++ .DLL 中的函数

c# - 有没有.Net4 BackgroundCopyManager.dll?

c# - dll 中的 WPF 自定义控件

delphi - 什么是 Delphi XE2 VCL 运行时 BPL?

c++ - C/C++ - HWInfo - libhd - 如何获取所有可用设备的名称列表?

C: 与 `swprintf` 关联的段错误

c - 学习动态内存分配

c - i++ 不在 while 循环内工作

c# - 在 .NET 对象上设置 "nullable"属性