耗时Ç的DLL用Delphi(consuming C dlls with Delphi)

2019-09-20 17:14发布

我有这个签名DLL函数:

UInt32 Authenticate(uint8 *Key);

我在德尔福这样做:

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

但始终,函数返回10(错误代码)和应用刹车:\

有一种方法可以做到这一点吗?

更新: 谢谢你们! 你是最好的!

Answer 1:

有一些问题与您的代码。

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;


Answer 2:

我想补充什么伟大雷米的答案,但我想给的工具,可以在C DLL头Pascal语言的转换帮助(在没有特殊顺序)的列表:

  • http://sourceforge.net/projects/c2pas
  • http://www.astonshell.com/freeware/c2pas32
  • http://cc.embarcadero.com/item/26951
  • http://rvelthuis.de/programs/convertpack.html
  • http://www.drbob42.com/delphi/headconv.htm
  • http://wiki.lazarus.freepascal.org/H2Pas
  • http://wiki.freepascal.org/Chelper

要注意的是,这些转换只能转换代码的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 ++:

  • http://rvelthuis.de/articles/articles-convert.html
  • http://rvelthuis.de/articles/articles-pchars.html
  • http://rvelthuis.de/articles/articles-cobjs.html
  • http://rvelthuis.de/articles/articles-cppobjs.html
  • http://www.awitness.org/delphi_pascal_tutorial/c++_delphi

稍微偏离主题,但我认为这可能是有用的人......



Answer 3:

对于初学者来说,变“串”到“PChar类型”。

有可能是除此之外的其他问题。



文章来源: consuming C dlls with Delphi