我有一个C++ function:

 long CSP2_API csp2GetPacket(char szData[], long nBcrNr, long nMaxDataSz)

参数是:
szData: buffer where the barcode data is stored in
nBcrNr: the desired barcode’s index (which starts from 0L)
nMaxDataSz: the maximum size of the szData buffer

我的处理方式是:
type
 TBarcode     = Array[0..99] of AnsiChar;


function csp2GetPacket(szBarData : TBarCode;
                      nBarcodeNumber: LongInt;
                      nMaxLength: LongInt): LongInt cdecl  {$IFDEF WIN32}stdcall {$ENDIF}; external 'CSP2.DLL';

并使用...
procedure TForm1.Button1Click(Sender: TObject);
var
BarCode : TBarcode;
begin

  BarCode := #0;
  csp2GetPacket(BarCode,0,SizeOf(BarCode));

end;

C++文档确认条形码使用标准ASCII文本。

是否有更好(更正确的方法)调用C++ function?还是可以接受?

最佳答案

这个:

long CSP2_API csp2GetPacket(char szData[], long nBcrNr, long nMaxDataSz)

像这样翻译:
function csp2GetPacket(szData: PAnsiChar; nBcrNr, nMaxDataSz: Longint): Longint; <calling-convention>;

您的翻译不正确。在C语言中,可以将数组降级为指针,但是在Delphi中,您确实会按值传递整个数组,因此转换与原始二进制不兼容。

我假设您拥有正确的调用约定。如果没有,只需删除stdcall即可。

我将简单地使用AnsiString作为参数,强制转换为PAnsiChar,大致类似:
var
  BarCode: AnsiString;
  L: Longint;
begin
  SetLength(L, 100);
  L := csp2GetPacket(PAnsiChar(BarCode), 0, Length(BarCode));
  // If csp2GetPacket returns the length, then:
  SetLength(BarCode, L);
  // Otherwise, this will work too:
  BarCode := PAnsiChar(BarCode); // Copies up to and including terminating #0

我不知道缓冲区长度的限制,所以我假设与您的代码长度相同。

我的文章中有关转化主题的更多信息:Pitfalls of converting

关于c++ - 德尔福XE7的C++函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44087069/

10-13 03:20