COM的interface接口可没有stream阿, 只有BSTR之类, 怎么返回或接收(100分)

  • 主题发起人 主题发起人 hussar
  • 开始时间 开始时间
H

hussar

Unregistered / Unconfirmed
GUEST, unregistred user!
()不知道在COM 里, 要把这个由WORD文件形成的Stream 或 Pchar的 buffer, 怎么把他当变量
传出去呢
COM的interface接口可没有stream阿, 只有BSTR之类。 或者说把他传出去, 到底该用
什么类型呢,怎么作, 哎! 谁能来帮我? 可以再加分啊。
help, help!!! 。。扑通。。 “救人啊!“
 
用VARIANT类型传递
 
string 不行吗?
 
用VARIANT类型传递 , 可以么? lwy 不只试过没有, 可否详细点
pchar存为二进制串 再作为 string行不行
word格式会怎样

string 肯定不行 word格式会丢的
 
翻翻那本开发大全,有类型对比的单篇。我这里的是D4版。
 
通常VARIANT可用于传递很大类型的参数,比如RecordSet就可以传递过去,关键是传递过去
后对数据的处理方式,自己可以灵活处理
 
推荐一本有关 com 或 Activx的书吧
 

<<COM技术内幕>>
 
Stream其实也只不过是对指针的一种封装。
同一进程应该可以改为传一个地址过去。

OLEVARIANT变量可以被赋傎为 WORD文件,WOED表格,office的每一部分,
office安装时有一个可选项,里面有整个office的编程说明,好像会装在2052/VBAXXX.hlp
 
传 Variant 当然可以, 但是怎么把由word文件转换成的 Stream (FileStream 或 MemoryStream)
付值给 Variant 呢? 以及反过来 调用的时候又该怎么办, 我想了很多办法, 可还是不行
只要能把 ActiveX控件控制的word文件传出来给调用程序就行。
 
传BSTR行不行
 
由机械工业出版社华章公司出版的“COM+开发人员参考库”,把所有COM和COM+
的关键参考资料浓缩成册,奉献给广大开发人员。此书共分五卷:《COM+程序员指南》、
《COM+参考》、《COM基础》、《自动化》、《结构化存储与ActiveX》
五卷书既相互结合,又各自相对独立:《COM+程序员指南》阐述了COM+是如何适应
Windows DNA 2000框架以创建可扩展的企业级解决方案,并且详细介绍了COM+开发过程
的所有关键技术;《COM+参考》提供全面完整的COM+参考,查阅起来十分方便快捷;
COM是COM+、微软OLE、ActiveX和其他程序设计技术的构建基础,《COM基础》一书专
为利用COM进行开发的程序设计人员提供详尽的指导;在《自动化》一书中,作者提供
了大量的VB和VC范例代码,读者可以结合代码前后的概念进行阐述,从而更加深入地理
解自动化的工作原理和编程思路;在《结构化存储与ActiveX》一书中,提供了关于结构
化存储和ActiveX控件所必需的编程信息,这两项技术均构建于COM的基础之上,该卷书
还包括了分别关于接口、函数、结构和枚举类型的详细参考。这五卷书由微软出版社
授权华章公司出版,并得到了微软公司全力的技术支持。

  
  
 
使用ADODB.Stream,详情参考ADO帮助文档
 
哎 ! 怎样从com接口得到word文件, 再解决不了, 我就完蛋了!
 
有个取巧的方法。
cds : TClientDataSet
aFieldDef :TFieldDef;
。。。
aFieldDef := cds.FieldDefs.AddFieldDef;
aFieldDef.DataType := ftBlob
...
cds.CreateDataSet;
用ClientDataSet的CreateDataSet的方法生成一个内存表
把流(你要自己保证这个流能还原Word文档)保存到这个字段中
然后把一个DataSetProvider的DataSet设为这个ClientDataSet

客户端就可以一个ClentDataSet取得这个数据集,并从这个字段中还原流了。
 
比较高档点的做法:
------转载
使用 IStream (2002年5月20日)

本站更新 分类:杂类 作者: 推荐: 阅读次数:380
( http://www.tommstudio.com )

--------------------------------------------------------------------------------
有许多技巧文档讲述如何将任意一种数据转化成 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


 
TO testnet
OLEVARIANT变量可以被赋傎为 WORD文件,WOED表格,office的每一部分,

请问 对WORD文件该怎样来做呢, 请指导一下 谢谢

 
传个Long类型地址不就完了,真是的。
 
后退
顶部