中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>数据库开发>代码分析>文章内容

delphi 使用 IStream

来源:网络 关于:轶名 发布时间:2007-07-02   [收藏] [推荐]
有许多技巧文档讲述如何将任意一种数据转化成 variant 的数据类型以将它们传递给一个COM接口。

  不管怎么样,许多VCL构件都有以流的方式工作的方法和属性。关键就是 TOLEStream 和 TStreamAdapter 的使用。

  IStream 被定义在 ActiveX 单元,TStreamAdapter 被定义在 Classes 单元,TOLEStream 则被定义在 Axctrls 单元中。

  下面的包裹类将为你提供你所需要的全部东西。(注意:不要将这些函数转化成属性,这样做可能会让你企图调用 IStream 方法,尽管它不是中读的,但是至少我这样做就遇到访问冲突的错误)

 

  Uses Classes, ActiveX, Axctrls;

 

  Type TInterfaceStream = Class ( TMemoryStream )

  Public

  Procedure LoadFromIStream(Source : IStream);

  Function GetIStream : IStream;

  end;

 

  Procedure TInterfaceStream.LoadFromIStream(Source : IStream);

  var

  Adapt : TOLEStream;

  Buff : Byte;

  I : Integer;

  begin

  ADapt := TOLEStream.Create(Source);

  Adapt.Position := 0;

  Self.Clear;

  Self.Position := 0;

  For I := 0 to Adapt.Size do

  begin

  Adapt.Read(Buff, 1);

  Self.Write(Buff, 1);

  end;

  Self.Position := 0;

  end;

 

  Function TInterfaceStream.GetIStream : IStream;

  var

  Adapt : TStreamAdapter;

  tPos : Int64;

  begin

  Adapt := TStreamAdapter.Create(Self);

  Adapt.Seek(0, 0, tPos);

  Result := Adapt as IStream;

  end;

 

  现在我们可以很简单地使用 IStream. 假如,你有一个 COM 对象方法需要返回一个 IStream,

  那你只需要简单地声明一个private的 TInterfaceStream 成员变量。( 这里我们估且将称它为 FStream ),

  在 initialize 时初始化它, 然后照下面的做法实现自己的方法:

 

  Function TSampleCOMObj.Mehtod1 : IStream

  begin

  // Here's where you load whatever actually goes into the stream

  result := FStream.GetIStream;

  end;

 

  将 TInterfaceStream 作为局部变量可能有些棘手。因为可能存在应用程序使用它之前它的内存就已经被释放掉的隐患。因此将它声明成一个 private 成员会更安全.

 

  应用程序中只需要做下面的事

 

  Procedure Form1.Button1OnClick(Sender : TObject);

  var

  Server : ISampleCOMObj;

  temp : IStream;

  ResultStream : TInterfaceStream;

  begin

  Server := CreateCOMObject(Class_TSampleCOMObj) as ISampleComObj;

  temp := Server.method1;

  ResultStream := TinterfaceStream.Create;

  ResultStream.Clear;

  resultStream.Position := 0;

  resultstream.LoadFromIStream(Temp);

  // do whatever it is you want with the data in the stream;

  end;


[浏览: 次]   
上一篇:delphi 将Datasets的数据DCOM方式传递   下一篇:delphi 在Delphi中使用Queued Components
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi Delphi_动态数组介绍----Delphi
·delphi 检查IP地址
·delphi DBExpress 提高
·delphi 复制Excel列到二维数组
·delphi Delphi_VCL消息处理机制的内幕
·delphi 产生不重复的随机数
·delphi 如何在DELPHI里调用MS office
·delphi 缓冲池
·delphi MIDAS——多层分布式应用程序服
·delphi 在WORD文档里添加页签
·delphi Asta多层应用实现
·delphi Datamodule的应用方式
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932