我有一个带有此签名的 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/