在线程中执行下面的函数,当我发送数据至线程后老出现下面这个错误。
---------------------------
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;