关于字节数组的使用(100分)

  • 主题发起人 主题发起人 hfeng
  • 开始时间 开始时间
H

hfeng

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:VC++ 声明的 BYTE serial[0x08]
Delphi中如何声明才和此声明一致呀,请富翁们指教下。是否与 serial:array[0..7] of BYTE 是一样的道理呢?? 但在具体使用中没法使用。
 
是这样申明没有错,不过没有办法使用就不明白你的意思,一般在delphi中申明的数组如果在调用api时候使用,一般是传数组第一个变量给api即可,比如这里就用serial[0]
 
首先谢谢你的回答,问题是这样,VC++编译后的DLL 声明的函数为:
DWORD _stdcall GetSerial
(
IN HANDLE hCard,
OUT BYTE serial[0x08]
);
变量的声明为:BYTE serial[0x08];
调用是:GetSerial(hCard, serial)

我这边转成DELPHI的函数申明为:
function GetSerial(hCard:pointer;serial:array of BYTE):DWORD;external 'Api.dll';
变量声明为: serial:array[0..7] of BYTE;
调用为:GetSerial(hCard, serial)
其中hCard为传入的句柄,这个没什么问题,因为其他方法可以调用,
就在调用BYTE类型的参数时出错,无法正常调用,
出现access violation at 0x000412a5,write of address Ox10c00000
出现这个问题才比较郁闷呀~~ 所以烦请哪位富翁再帮忙看看,是不是哪里写错了.
 
动态数组是Delphi独有的数据类型,不能将C++的任何参数翻译成它。C++的数组实际上就
是指向第一个元素的指针。试试这样写:

function GetSerial(hCard:pointer;serial:PBYTE):DWORD;external 'Api.dll';

这样使用:
var
P:PByte;
n:DWord;
hCard:Pointer;
Datas:array[0..7] of Byte;
begin
...
n:=GetSerial(hCard,P);
Move(P^,Datas[0],8)
//将指针P所指向的地址中连续8个字节的数据复制到Datas数组
//或者,这样调用:
n:=GetSerial(hCard,@Datas[0])
//C的数组就是指向首元素的指针,给它所需要的:)
end;
 
creation-zy,你好,很感谢你给出的帮助,给出了Delphi数组的特点,有了点思路,不知道能否留下你的QQ或MSN或E-mail联系方式,想具体再请教你些问题~~ 万分感谢~~
 
现在的情况是,不会抛出异常错误,但返回值和VC++传出来的值不对应~~ 可能是在传参的时候有误 : GetSerial(hCard, serial) 此处传入参数 serial
,还请富翁们不吝赐教,谢谢~~
 
Q: 017 904 4048 无尽愿
 
多人接受答案了。
 
后退
顶部