2013-04-09 77 views
1

我有一些数据的字节数组...字节数组PAnsiChar在2007年德尔福

CommandBytes : array of byte; 

和我有一个VCL的函数发送命令到蓝牙打印机。 的VCL函数原型是本

SendData(PAnsiChar, Cardinal); 

“这种方法从存储器缓冲器发送字节到打开装置”

如何可以传递正确的字节数组函数发送命令到打印机?

我是新来的Delphi,我想:

SendData(PAnsiChar(@CommandBytes[0]), SizeOf(CommandBytes)); 

,但它不提前工作...

感谢。

+1

'SendData'函数看起来很奇怪的设计。与C和C++不同,Pascal对字节和字符有不同的类型。所以我通常期望'PAnsiChar'是一个空终止的指针。并且指向要声明为“PByte”的字节数组的指针。 SendData是由第三方定义的吗?在这种情况下,我想你必须适应它。但如果它是你的功能,那么我会把它改成'PByte'。 – 2013-04-09 09:08:07

+0

对不起,我不知道...我只接受你的答案。 – user2075861 2013-04-15 14:46:04

回答

7

SizeOf()产生一个指针的大小。动态数组是一种引用类型,表示为指向数组的第一个元素的指针。因此SizeOf()返回指针的大小。这对你来说毫无用处。

您需要使用Length()代替:

SendData(PAnsiChar(@CommandBytes[0]), Length(CommandBytes)); 

Length()函数返回数组中元素的个数。

更重要的是,我可能会简化您投射到PAnsiChar的方式。你可以这样做更简明这样的:

SendData(PAnsiChar(CommandBytes), Length(CommandBytes)); 

这是有意义的,因为CommandBytes,是一个动态数组的引用,指向数组的第一个元素。

1

SizeOf(CommandBytes)将返回一个指针的大小。

使用Length(CommandBytes)得到阵列,在这种情况下是分配的缓冲区大小的元素计数,因为一下SizeOf动态阵列上(字节)= 1

+1

'Length'返回元素数而不是大小。如果因为SizeOf(元素)是1而碰巧在这里是相同的东西。 – 2013-04-09 08:32:39

+0

感谢大家! – user2075861 2013-04-10 15:32:50