我有这个签名DLL函数:
UInt32 Authenticate(uint8 *Key);
我在德尔福这样做:
function Authenticate(Key:string) : UInt32; external 'mylib.dll' name 'Authenticate';
但始终,函数返回10(错误代码)和应用刹车:\
有一种方法可以做到这一点吗?
更新: 谢谢你们! 你是最好的!
我有这个签名DLL函数:
UInt32 Authenticate(uint8 *Key);
我在德尔福这样做:
function Authenticate(Key:string) : UInt32; external 'mylib.dll' name 'Authenticate';
但始终,函数返回10(错误代码)和应用刹车:\
有一种方法可以做到这一点吗?
更新: 谢谢你们! 你是最好的!
有一些问题与您的代码。
1) uint8
是的equivilent Byte
在Delphi,不String
。
2)C代码是使用编译器的默认调用约定,这通常是__cdecl
。 德尔福的默认调用约定,而另一方面,是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代码相匹配。 即使函数需要一个空值终止字符串作为输入,您还可以通过它使用PByte
通过类型强制转换:
var
S: AnsiString;
begin
Authenticate(PByte(PAnsiChar(S)));
end;
或者,如果函数允许空字符串NULL输入:
var
S: AnsiString;
begin
Authenticate(PByte(Pointer(S)));
end;
我想补充什么伟大雷米的答案,但我想给的工具,可以在C DLL头Pascal语言的转换帮助(在没有特殊顺序)的列表:
要注意的是,这些转换只能转换代码的60-80%,所以手工作业如下。
最大的节省时间的提示,我可以给是要设法找到的Visual Basic标题翻译,如果它存在于你的DLL,并利用马可坎图的VB转换器在http://www.marcocantu.com/tools/vb2delphi.htm 。 这可能会给你几乎100%自动转换(如果您正在转换只是DLL头,当然)。 还有一个商业VBto转换,但试用演示是很不够的VB DLL头Pascal语言的转换。 在这里下载: http://www.vbto.net
从C转换其他提示 - / C ++:
稍微偏离主题,但我认为这可能是有用的人......
对于初学者来说,变“串”到“PChar类型”。
有可能是除此之外的其他问题。