在Ansi-C中导入Delphi Dll

时间:2014-12-02 06:10:50

标签: c delphi dll

我想知道是否有人在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);

1 个答案:

答案 0 :(得分:1)

C:

中的声明
int resCommand(int anH, char* pstr, char *Var);  

等同于Delphi中的这个声明:

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

请注意,使用PAnsiChar代替PCharPChar是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_tchar16_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);