在delphi7中使用vc编写的一个ocx控件,我要使用它的一个接口函数,把我从网络中通过idudpserver接收的视频数据流传给这个函数进行处理,这个函数的原形是: long InputVideoDate(long *plDate, long lDataLen);
//plData—指向数据缓冲区的指针
//lDateLen—缓冲区的长度。 当我将该控件导入到delphi中后,这个接口函数的参数就变成下面类型: InputVideoDate(var pData:Integer,lDataLen:Integer):Integer; 发现参数pData由“long *plDate”变成了“var pData:Integer”,就不知道如何处理了。 于是我编写代码进行测试,可是当执行到InputVideoDate函数时报错!"access violation at 0x0061efcb: read of address 0x11000825"代码如下:procedure TFormMain.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
pData: integer ;
lDataLen:Integer;
begin
lDataLen:=AData.Size; //接收流的长度
AData.ReadBuffer(pData,lDataLen);//从流中读出全部数据
InputVideoDate(pData,lDataLen); //将数据传给InputVideoDate处理 ,(当执行本条代码时报错)
end ; 请高手指点一下,我如何才能正确调用这个接口函数InputVideoDate(var pData:Integer,lDataLen:Integer):Integer;
//plData—指向数据缓冲区的指针
//lDateLen—缓冲区的长度。 当我将该控件导入到delphi中后,这个接口函数的参数就变成下面类型: InputVideoDate(var pData:Integer,lDataLen:Integer):Integer; 发现参数pData由“long *plDate”变成了“var pData:Integer”,就不知道如何处理了。 于是我编写代码进行测试,可是当执行到InputVideoDate函数时报错!"access violation at 0x0061efcb: read of address 0x11000825"代码如下:procedure TFormMain.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
pData: integer ;
lDataLen:Integer;
begin
lDataLen:=AData.Size; //接收流的长度
AData.ReadBuffer(pData,lDataLen);//从流中读出全部数据
InputVideoDate(pData,lDataLen); //将数据传给InputVideoDate处理 ,(当执行本条代码时报错)
end ; 请高手指点一下,我如何才能正确调用这个接口函数InputVideoDate(var pData:Integer,lDataLen:Integer):Integer;
InputVideoDate(pData:PInteger,lDataLen:Integer):Integer;
调用的时候这样
InputVideoDate(@pData,lDataLen);
pData:integer;
lDataLen:Integer;
buf:pbyte;
begin
lDataLen:=AData.Size;
getmem(buf,lDataLen);
pData:=integer(buf);
try
AData.ReadBuffer(buf,lDataLen);
InputVideoDate(pData,lDataLen);
Finally
FreeMem(buf);
end;
end ;//直接写的,没调试过
long InputVideoDate(long *plDate, long lDataLen);
既然plData—指向数据缓冲区的指针那为什么要还要long *pldata?这是声明了一个指向整数的指针,应该改成void *pldata或者char *pldata,如果不能改的话可以参照上楼的写法,你那段代码根本就有问题,
AData.ReadBuffer(pData,lDataLen);//从流中读出全部数据,pdata是整数,有这么写的么?