全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1446
推到 Plurk!
推到 Facebook!

读写任意类型的Variant到Stream

 
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-18 18:11:24 IP:218.80.xxx.xxx 未訂閱
当我用TCP自己处理c/s的函数调用时,给用户使用的函数是这个样式: TServiceProc=function(const AParams:OLEVariant):OLEVariant of object; 于是需要把AParams写到Stream发到Server,再把结果从Stream中解出,如果有exception,还要把exception传回。    参考TReader/TWriter,去掉了其中对元件的读写,加入了对varArray的读写,exception的读写。    使用demo:
function TDMMidasTCP.Call(AServiceName: string;
  const AMethodName: string; const AParams: OLEVariant): OLEVariant;
var
  MS:TMemoryStream;
  VW:TVariantWriter;
  VR:TVariantReader;
  Error:Exception;
begin       
  MS:=TMemoryStream.Create;
  try
    VW:=TVariantWriter.Create(MS);
    try
      VW.WriteVariant(AServiceName);
      VW.WriteVariant(AMethodName);
      VW.WriteVariant(AParams);
      MS.Position:=0;
      IdTCPClient_Main.Connect;
      IdTCPClient_Main.WriteStream(MS,true,true);
    finally
      VW.Free;
    end;
    MS.Clear;      
    IdTCPClient_Main.ReadStream(MS);        IdTCPClient_Main.Disconnect;
    VR:=TVariantReader.Create(MS);
    try
      MS.Position:=0;
      Error:=VR.ReadException;
      if Error<>nil then Raise Error;
      Result:=VR.ReadVariant;
    finally
      VR.Free;
    end;
  finally
    MS.Free;
  end;
end;
写到此,顺便问一句,我们经常用Raise Exception.Create('sfsfsf');来举发例外,我们创建的这个Exception元件,delphi会为我们及时释放吗? 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2005/02/18 18:16:33
------
江上何人初见月,江月何年初照人
附加檔案:65300_VariantStream.pas
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-24 11:44:23 IP:218.80.xxx.xxx 未訂閱
关于我顺便问的问题,我用如下代码测试:
1  procedure TForm1.BitBtn1Click(Sender: TObject);
2  var
3    E:Exception;
4  begin
5    E:=Exception.Create('Error!');
6    try
7      Raise E;
8    finally
9      E.Free;
10   end;
11 end;
错误Raise后,再企图去free,报了地址错,说明编译器自动加上了释放E的代码,因此不用担心memory leak。 但我发现一个有趣的现象,就是第7行弹出的错误框是空的,一个字也没有: 如果把第9行隐掉,第7行弹出的错误框就有字了。好奇怪! < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=10543105&CC=235795"> 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2005/02/24 11:47:54
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-28 10:48:22 IP:218.80.xxx.xxx 未訂閱
对不起,修改一个bug:
function TVariantReader.ReadByteArray: Variant;
var
  Lo,Hi:integer;
  P:Pointer;
begin
  ReadValue;
  Read(Lo,SizeOf(integer));
  Read(Hi,SizeOf(integer));
  Result:=VarArrayCreate([Lo,Hi],varByte);
  P:=VarArrayLock(Result);
  try
    Read(P^,Hi-Lo+1);
  finally
    VarArrayUnLock(Result);
  end;
end;
久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
系統時間:2024-07-04 17:02:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!