在线程中执行下面的函数,当我发送数据至线程后老出现下面这个错误。
---------------------------
Debugger Exception Notification
---------------------------
Project GPRSServer.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
程序如下:procedure TGPRSClientThread.AnalysisAndSaveData();
var
vChaoBianDateTime,vID,vBID,vUserID,vUserState,vUserPort,vBCCM : string;
//vChaoBianDateTime,vID,vBID,vUserID,vUserState,vUserPort,vBCCM : pchar;
i,k,vMonitorDataLen,vMonitorUsers,vChaobianDataLen : Integer;
TmpData : array of Byte;
vHandlLen : integer;
vSqlStr : string;
//ADOQuery : TADOQuery;
begin
//获取抄表时间
SetLength(TmpData,5);
for i:=0 to 5 do
TmpData[i] := Data[69+i];
vChaoBianDateTime := BytesToByteStr(TmpData,5);
vChaobianDataLen := StrToInt('$'+ IntToHex(Data[67],2)+ IntToHex(Data[68],2));//用户数据长度
//获取显示器的长度
vHandlLen := 0;
if not Assigned(ADOQuery) then
ADOQuery:=TADOQuery.Create(nil);
ConnectDatabaseServer(ADOQuery,'','','','');
try
while vChaobianDataLen>=vHandlLen+7 do
begin
//获取显示器的长度
vMonitorDataLen := Data[75+vHandlLen];
{解析显示器数据包中的数据}
//1.显示器ID
TmpData:=nil;
SetLength(TmpData,4);
for i:=0 to 4 do
TmpData[i] := Data[76+vHandlLen+i];
vBID := BytesToByteStr(TmpData,4);
vMonitorUsers := (vMonitorDataLen-6) div 15 ;
for k:=0 to vMonitorUsers-1 do
begin
iUserNum := iUserNum+1;
vUserState := IntToHex(Data[k*15+82+vHandlLen],2);
vUserPort := IntToHex(Data[k*15+83+vHandlLen],2);
vUserID := IntToHex(Data[k*15+85+vHandlLen],2) + IntToHex(Data[k*15+86+vHandlLen],2);
vBCCM := IntToHex(Data[k*15+89+vHandlLen],2) + IntToHex(Data[k*15+90+vHandlLen],2) + IntToHex(Data[k*15+91+vHandlLen],2) + IntToHex(Data[k*15+92+vHandlLen],2);
//插入小数点
vBCCM := Copy(vBCCM,0,Length(vBCCM)-StrToInt(Copy(IntToHex(Data[84+vHandlLen],2),0,1))) +'.' + Copy(vBCCM,Length(vBCCM)-StrToInt(Copy(IntToHex(Data[84+vHandlLen],2),0,1))+1, strtoint(Copy(IntToHex(Data[84+vHandlLen],2),0,1)));
//保存至数据库中
vID := vBID+vUserID;
vSqlStr :=Format('EXEC P_SaveGPRSDataToTbl ''%s'',''%s'',''%s'',''%s'',''%s''',[vID,vBCCM,vUserState,vChaoBianDateTime,vClientMobile]);
F_ExecSql(ADOQuery, vSqlStr, 'E');
end;
//定位是下个显示的长度位置(循环判断并解析下个显示器数据)
vHandlLen := vHandlLen + vMonitorDataLen + 1;
iMonitorNum := iMonitorNum + 1;
end;
finally
TmpData:=nil;
FreeAndNil(ADOQuery);
FreeAndNil(ADOConn);
end;
end;
---------------------------
Debugger Exception Notification
---------------------------
Project GPRSServer.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
程序如下:procedure TGPRSClientThread.AnalysisAndSaveData();
var
vChaoBianDateTime,vID,vBID,vUserID,vUserState,vUserPort,vBCCM : string;
//vChaoBianDateTime,vID,vBID,vUserID,vUserState,vUserPort,vBCCM : pchar;
i,k,vMonitorDataLen,vMonitorUsers,vChaobianDataLen : Integer;
TmpData : array of Byte;
vHandlLen : integer;
vSqlStr : string;
//ADOQuery : TADOQuery;
begin
//获取抄表时间
SetLength(TmpData,5);
for i:=0 to 5 do
TmpData[i] := Data[69+i];
vChaoBianDateTime := BytesToByteStr(TmpData,5);
vChaobianDataLen := StrToInt('$'+ IntToHex(Data[67],2)+ IntToHex(Data[68],2));//用户数据长度
//获取显示器的长度
vHandlLen := 0;
if not Assigned(ADOQuery) then
ADOQuery:=TADOQuery.Create(nil);
ConnectDatabaseServer(ADOQuery,'','','','');
try
while vChaobianDataLen>=vHandlLen+7 do
begin
//获取显示器的长度
vMonitorDataLen := Data[75+vHandlLen];
{解析显示器数据包中的数据}
//1.显示器ID
TmpData:=nil;
SetLength(TmpData,4);
for i:=0 to 4 do
TmpData[i] := Data[76+vHandlLen+i];
vBID := BytesToByteStr(TmpData,4);
vMonitorUsers := (vMonitorDataLen-6) div 15 ;
for k:=0 to vMonitorUsers-1 do
begin
iUserNum := iUserNum+1;
vUserState := IntToHex(Data[k*15+82+vHandlLen],2);
vUserPort := IntToHex(Data[k*15+83+vHandlLen],2);
vUserID := IntToHex(Data[k*15+85+vHandlLen],2) + IntToHex(Data[k*15+86+vHandlLen],2);
vBCCM := IntToHex(Data[k*15+89+vHandlLen],2) + IntToHex(Data[k*15+90+vHandlLen],2) + IntToHex(Data[k*15+91+vHandlLen],2) + IntToHex(Data[k*15+92+vHandlLen],2);
//插入小数点
vBCCM := Copy(vBCCM,0,Length(vBCCM)-StrToInt(Copy(IntToHex(Data[84+vHandlLen],2),0,1))) +'.' + Copy(vBCCM,Length(vBCCM)-StrToInt(Copy(IntToHex(Data[84+vHandlLen],2),0,1))+1, strtoint(Copy(IntToHex(Data[84+vHandlLen],2),0,1)));
//保存至数据库中
vID := vBID+vUserID;
vSqlStr :=Format('EXEC P_SaveGPRSDataToTbl ''%s'',''%s'',''%s'',''%s'',''%s''',[vID,vBCCM,vUserState,vChaoBianDateTime,vClientMobile]);
F_ExecSql(ADOQuery, vSqlStr, 'E');
end;
//定位是下个显示的长度位置(循环判断并解析下个显示器数据)
vHandlLen := vHandlLen + vMonitorDataLen + 1;
iMonitorNum := iMonitorNum + 1;
end;
finally
TmpData:=nil;
FreeAndNil(ADOQuery);
FreeAndNil(ADOConn);
end;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货