我有一个带有这个签名的 Dll 函数:
UInt32 Authenticate(uint8 *Key);
我在 Delphi 上这样做:
function Authenticate(Key:string) : UInt32; external 'mylib.dll' name 'Authenticate';
但总是,函数返回 10(错误代码)并且应用程序刹车:\
有办法做到这一点吗?
更新: 谢谢大家!你是最好的!
我有一个带有这个签名的 Dll 函数:
UInt32 Authenticate(uint8 *Key);
我在 Delphi 上这样做:
function Authenticate(Key:string) : UInt32; external 'mylib.dll' name 'Authenticate';
但总是,函数返回 10(错误代码)并且应用程序刹车:\
有办法做到这一点吗?
更新: 谢谢大家!你是最好的!
您的代码存在一些问题。
1)uint8
是Byte
Delphi 中的等价物,而不是String
.
2) C 代码使用编译器的默认调用约定,通常是__cdecl
. 另一方面,Delphi 的默认调用约定是register
。它们彼此不兼容。如果调用约定不匹配,则在运行时的函数调用期间将无法正确管理堆栈和 CPU 寄存器。
C 代码的直译是这样的:
function Authenticate(Key: PByte) : UInt32; cdecl; external 'mylib.dll';
但是,假设该函数实际上需要一个以空字符结尾的字符串,则改为执行以下操作:
// 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
通过类型转换将其传递给 using:
var
S: AnsiString;
begin
Authenticate(PByte(PAnsiChar(S)));
end;
或者,如果函数允许空字符串输入 NULL:
var
S: AnsiString;
begin
Authenticate(PByte(Pointer(S)));
end;
我不会在伟大的 Remy 的回答中添加任何内容,但我想提供一个可以帮助将 C DLL 头文件转换为 Pascal 的工具列表(无特殊顺序):
请注意,这些转换器只能转换 60-80% 的代码,因此需要手动操作。
我可以给出的最大的节省时间的提示是尝试找到适用于您的 DLL 的 Visual Basic 头文件翻译,并使用http://www.marcocantu.com/tools/vb2delphi.htm上的 Marco Cantu 的 VB 转换器。这可能会为您提供几乎 100% 的自动转换(当然,如果您只是转换 DLL 标头)。还有一个商业 VBTO 转换器,但试用演示足以将 VB DLL 头文件转换为 Pascal。在这里下载:http ://www.vbto.net
从 C--/C++ 转换的其他提示:
稍微偏离主题,但我认为这可能对某人有用......
对于初学者,将“string”更改为“pchar”。
除此之外可能还有其他问题。