我有一个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/