gpt4 book ai didi

我可以在 Delphi 中使用 C 头文件吗?

转载 作者:行者123 更新时间:2023-12-02 11:03:07 25 4
gpt4 key购买 nike

是否可以使用 Rad Studio XE C++ 编译器编译 C 头文件并将其与 Delphi 代码链接?

这样就不需要将头文件转换为 pascal 了?

问题的原因是..

C - header 定义:

DLLEXPORT int url_engine_version(char *version, size_t length);

尝试 Delphi 定义

function url_engine_version(version: PByte; var length: cardinal): integer;
cdecl; external 'corplib.dll';

主应用程序尝试使用以下方式调用它:

engVer: Pointer;
engLen: cardinal;

engLen := 64;
GetMem(engVer,engLen);
url_engine_version(engVer,engLen);

但是 Delphi AV 在尝试调用例程时。

工作 C# 定义 - 如果我传递一个预定义为长度 64 的 StringBuilder,Chick 就会工作

[DllImport("corplib.dll", CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl)]
public static extern int url_engine_version(StringBuilder version, [Out] int length);

最佳答案

您实际问题的答案是:不。抱歉。

但是,我认为在这种情况下问题很简单......

您在此处复制的 C 头文件是错误的,或者 C# 声明是错误的,或者您非常幸运,没有像 Delphi 代码那样严重崩溃和烧毁 C# 代码。

我认为的问题是 C header 将 length 参数声明为 SIZE_T,不是 指向 SIZE_T 的指针。即它是输入参数,而不是输出或输入/输出参数。

您可能使用length来指定为您在version中传递的指针分配的缓冲区大小。我进一步假设该函数返回用于放置在版本缓冲区中的数据的实际字节数。

我相信 Delphi 版本会崩溃,因为通过将 length 指定为 var,您将通过引用传递 length,即函数接收不是“64”,而是指向值“64”的指针,但它使用的是这个指针值,而不是 64 值。

C# 代码可能会通过将参数声明为 out(如果 C header 本身正确的话,这也是错误的)来躲避子弹。这可能会转化为即使不正确,至少在运行时不会“严重错误”的东西。

我认为只需从长度参数声明中删除“var”就可以解决您的问题:

function url_engine_version(aVersion: PByte; aLength: cardinal): integer; cdecl; external 'corplib.dll';

关于我可以在 Delphi 中使用 C 头文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4614579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com