读写任意类型的Variant到Stream |
|
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
当我用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
------
江上何人初见月,江月何年初照人 |
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
关于我顺便问的问题,我用如下代码测试:
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 發送簡訊給我 |
对不起,修改一个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;久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |