gpt4 book ai didi

c - 在 Ansi-C 中导入 Delphi Dll

转载 作者:行者123 更新时间:2023-11-30 19:18:01 25 4
gpt4 key购买 nike

我想知道是否有人有在 Delphi 中使用 PChar var 的经验。

我有一个模块(可编程电阻)正在与此功能通信:

int resCommand(int anH, char* pstr, char *Var);  

如果我要从电阻器获取数据,我需要读取*Var。在模块的描述中他们描述了这个原型(prototype):

function rbResiCommand(aHandle: integer; aData: pChar; VAR aResult: pChar): integer; 

问题是我如何处理指针 Var aResult 因为我需要来自 Delphi dll 的 Var aResult 的字符串?

我这里还有一个输出参数,那么这可以在 ANSI C 中实现吗?

我的代码:

VarResult[255]; 
char *pResult;

pResult = VarResult;
get = rbResiCommand(aHandle, "GET0", VarResult);
printf("Read Data from Channel 0: %s", VarResult);

最佳答案

此声明在 C:

int resCommand(int anH, char* pstr, char *Var);  

相当于 Delphi 中的这个声明:

function resCommand(anH: Integer; pstr: PAnsiChar; Var: PAnsiChar): Integer; cdecl;

请注意使用 PAnsiChar 而不是 PChar(PChar 是 Delphi 2007 中 PAnsiChar 的别名,更早的版本,但在 Delphi 2009 及更高版本中是 PWideChar 的别名),以及显式的 cdecl 调用约定。

Delphi 中的此声明:

function rbResiCommand(aHandle: integer; aData: pChar; VAR aResult: pChar): integer; 

相当于C中的这个声明:

int __fastcall rbResiCommand(int aHandle, Char *aData, Char** aResult); 

注意使用Char(大写C)而不是char(小写c),一个额外的最后一个参数的间接级别以及不同的调用约定(__fastcall 而不是 __cdecl)。

Char(大写C)是 Delphi 原生 Char 类型的 C++Builder typedef,并且将根据需要映射到 charwchar_tchar16_t,具体取决于编译器和 RTL 版本。

在这种情况下,

__fastcall 仅适用于 C++Builder,它与 Delphi 特定功能兼容。没有其他 C/C++ 编译器支持 Borland 风格的 __fastcall。 Microsoft 的 __fastcall 是另一回事 - C++Builder 支持它作为 __msfastcall)。

假设在 rbResiCommand 文档中简单地省略了调用约定,并且实际上是 DLL 中的 cdecl,并且该 DLL 是用 Delphi 版本编写的,其中 PChar 映射到 PAnsiChar,那么您的 C 代码应如下所示:

int __cdecl rbResiCommand(int aHandle, char* aData, char** aResult); 

...

char VarResult[255];
char *pResult = VarResult;
get = rbResiCommand(aHandle, "GET0", &pResult);
printf("Read Data from Channel 0: %s", VarResult);

无论哪种情况,都假设 DLL 只是填充您提供给它的数组(在这种情况下,不需要额外的间接寻址),并且不分配自己的内存并将其返回给您使用(这是额外间接通常用于)。如果它正在分配内存,那么您需要删除数组:

int __cdecl rbResiCommand(int aHandle, char* aData, char** aResult); 

...

char *pResult = NULL;
get = rbResiCommand(aHandle, "GET0", &pResult);
printf("Read Data from Channel 0: %s", pResult);
// free pResult however the DLL requires you to free it...

关于c - 在 Ansi-C 中导入 Delphi Dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27242959/

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