下面得语句不知是否妥当? (50分)

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

handsome1234

Unregistered / Unconfirmed
GUEST, unregistred user!
dll的函数说明:
WORD MCS_AutoTest(
BYTE *_bCardType
);
_bCardType
字符型指针。指向一个字符,其内容为检测到的卡片类型代码,返回给应用程序。应用程序应确保在调用此函数前,已分配给_bCardType指针至少1个字节的空间。

我在delphi中静态调用:声明:
function MCS_AutoTest(var _bCardType : Pbyte):WORD;stdcall;external'MCS_SR.dll';

调用时:
var
CardType:pbyte

begin
...
GetMem(CardType,sizeof(byte)*200);
CResult:=MCS_AutoTest(CardType);
//我对CardType的观察发现,CardType的数据以0占多数,
//不知是不是调用得不对?从CResult的值判断:
//我对MCS_AutoTest()函数调用是正确的

end;
2是不是GetMem调用完后对内容要填充一下啊?
 
别用GetMem,这种几个字节的变量没必要动态分配吧?
var
CardType:string;

CResult := MCS_AutoTest(@CardType);
...

还有,既然只申明了一个字节的指针,为什么要分配200个字节给它?
 
在Delphi中,可以简单的使用 New 过程为指针分配空间,它会自动根据指针的类型分配
适当大小的空间。
eg:
var
PA:pInteger;
PB:^TPoint;
PC:pChar;
begin
New(PA)
//分配SizeOf(Integer)大小的空间 4Byte
New(PB)
//分配SizeOf(TPoint)大小的空间 8Byte
New(PC)
//分配SizeOf(Char)大小的空间 1Byte
end;

GetMem过程用于分配指定大小的内存,它不会自动初始化被分配的空间。
另外,我认为 (var _bCardType : Pbyte) 应改为 (_bCardType : Pbyte)——传值即可,
不用传地址。
 
用 AllocMem,它在分配内存后,自动全部填充 0。

另外,如 creation-zy 所说,参数定义为值传即可,指针本身就可以实现改变内容了。
 
顶部