我打算在ClientDataSet的BeforeGetRecords\afterGetRecords和DataSetProvider的相应事件中进行加密和解密操作,但现在有个问题就是加密后的数据可能出现特殊字符如chr(160),在封包的过程中出现了丢失字符的问题,还请各位帮忙!
代码如下:
procedure TForm1.ClientDataSet1BeforeGetRecords(Sender: TObject;
  var OwnerData: OleVariant);
var
  s: Ansistring;
  i:integer;
begin
  s := ClientDataSet1.CommandText;
  s := encrypt(s,12345);   //加密
  OwnerData := VarArrayOf([s]); //封包
end;procedure TForm1.DataSetProvider1BeforeGetRecords(Sender: TObject;
  var OwnerData: OleVariant);
var
  s: Ansistring;
  i:integer;
begin
  try
    SQLQuery1.Close;
    s := OwnerData[0];  //解包
    s := Decrypt(s,12345);//解密
    showmessage(s);
    SQLQuery1.SQL.Text :=s;
    SQLQuery1.Open;
  finally
    OwnerData := NULL;
  end;end;不知道各位有没有遇到这个问题,怎么解决的?十万分感谢!!

解决方案 »

  1.   

    非常感谢 HanJingJingHan(静) 的回答,但我现在不知道怎样将OleVariant类型的数据变成流,而且我发现当ClientDataSet触发BeforeGetRecords的时候OleVariant中并没有数据。
    使用VarArrayHighBound会提示参数错误,我不能得到OleVariant的长度也就不能取出数据了。
    有没有这方面的程序代码?[email protected] 非常感谢!
      

  2.   

    将数据先转为base64格式的可见字符串,,然后再加密传输.另一端解开即可.给你参考一个我写的:
    function  GetEncodedBase64(const AFileName:string):string;  //ѹËõÎļþ
    var
        ass,ass1:tstringstream;
        amm,amm1:tmemorystream;
        strtemp:string;
        mscompressedstream:tcompressionstream;
    begin
        ass:=tstringstream.Create('');
        amm:=tmemorystream.Create ;
        ass1:=tstringstream.Create('');
        amm1:=tmemorystream.Create ;    try
            amm.LoadFromFile(afilename);
            amm.SaveToStream(ass);
            strtemp:=ass.DataString;
            try
                mscompressedstream:=tcompressionstream.Create(cldefault,amm1);
                mscompressedstream.Write(strtemp[1],length(strtemp));
            finally
                mscompressedstream.Free ;
            end;
            amm1.Position :=0;
            amm1.SaveToStream(ass1);
            //encodestream(amm1,ass1);
            result:=encodestring(ass1.DataString);
        finally
            amm.Free;
            ass.Free;
            amm1.Free;
            ass1.Free ;
        end;end;function  GetDecodedBase64(SourceStr:string):string;  //µÃµ½½âѹºóµÄ×Ö·û!
    var
        ass:tstringstream;
        amm,amm1:tmemoryStream;
        uncompressed:tdecompressionstream;
        fbuflen:integer;
        fbuffer:array[0..16383] of byte;
    begin
        amm:=tmemoryStream.create;
        amm1:=tmemoryStream.create;
        ass:=tstringstream.Create(decodestring(SourceStr));
        amm1.LoadFromStream(ass);
        try
            amm.Size :=0;
            amm1.Position :=0;
            uncompressed:=tdecompressionstream.Create(amm1);
            try
                    fbuflen:= uncompressed.Read(fbuffer,sizeof(fbuffer));
                    while fbuflen>0 do
                    begin
                            amm.Write(fbuffer,fbuflen);                        fbuflen:=uncompressed.Read(fbuffer,sizeof(fbuffer));
                    end;
            finally
                  uncompressed.Free ;
            end;        amm.Position :=0;
            setlength(result,amm.size);
            move(amm.memory^,result[1],amm.Size );    finally
            ass.Free ;
            amm.Free ;
            amm1.Free ;
        end;end;