我想知道是否有人在Delphi中有PChar
var的经验。
我有一个与此功能通信的模块(可编程电阻):
int resCommand(int anH, char* pstr, char *Var);
如果我从电阻器获取数据,我需要阅读*Var
。在模块的描述中
他们描述了这个原型:
function rbResiCommand(aHandle: integer; aData: pChar; VAR aResult: pChar): integer;
问题是如何处理指针Var aResult
因为我需要来自Delphi dll的Var aResult
的字符串?
此外,我还有一个Out参数,这可以在ANSI C中实现吗?
我的代码:
VarResult[255];
char *pResult;
pResult = VarResult;
get = rbResiCommand(aHandle, "GET0", VarResult);
printf("Read Data from Channel 0: %s", VarResult);
答案 0 :(得分:1)
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
的别名,但是PWideChar
的别名在Delphi 2009及更高版本中),以及明确的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的原生typedef
类型的C ++ Builder Char
,并将映射到char
,根据需要,wchar_t
或char16_t
,具体取决于编译器和RTL版本。
__fastcall
仅适用于C ++ Builder,它与Delphi特有的功能兼容。没有其他C / C ++编译器支持Borland的__fastcall
风格。微软的__fastcall
是其他东西--C ++ Builder支持它为__msfastcall
)。
假设调用约定在rbResiCommand
文档中被省略,并且在DLL中确实是cdecl
,并且DLL是在Delphi版本中编写的,其中PChar
映射到{ {1}},那么你的C代码应如下所示:
PAnsiChar
在任何一种情况下,这都假设DLL只是填充你提供给它的数组(在这种情况下,没有必要额外的间接)并且没有分配自己的内存并将它返回给你使用(其中额外的间接通常用于)。如果是分配内存,那么你需要摆脱你的数组:
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);