如何实现TMemoryStream到IDataObject的转换?(200分)

  • 主题发起人 主题发起人 zbzb
  • 开始时间 开始时间
Z

zbzb

Unregistered / Unconfirmed
GUEST, unregistred user!
问题如标题所述。
我想思路应该是:TMemoryStream --> IStream --> IDataObject;但应该如何实现?
 
还真的没有这方面的资料~
只有介绍IDataObject在拖放文件时的~
 
TMemoryStream就是分配了一快内存,她有Memory属性,
通过他设置IDataObject.SetData方法什么的,应该不是
什么难事。
 
无忌兄能否给个具体的例程?兄弟我很急!
 
找本潘爱民老师的《COM的原理和应用》里面有例子和说明的,
到哪个时候你直接用API做算了,用什么TMemoryStream呀
 
你去找找DELPHI的OleCtnrs.pas单元,里面应该有你要的东西。
 
var
ms: TMemoryStream;
Ism: IStream;
Data: IDataObject;
Osm: TOleStream;
begin
ms:=TMemoryStream.Create;
ms.LoadFromFile(testfile);
try
CreateStreamOnHGlobal(0,true,Ism);
Osm:=TOleStream.Create(Ism);
Osm.CopyFrom(ms,ms.Size);}
OleLoadFromStream(Ism,IID_IUnknown,Data); //在这里失败!
......
finally
ms.Free;
end;
end;
--------------
我对Ole的东西理解不深,希望大家帮忙!
 
无忌兄,帮人帮到底!
 
Delphi中没有IID_IUnknown定义,用IUnknown代替:
OleLoadFromStream(Ism, IUnknown, Data);
 
谢谢qsoft.51.net的帮助,可惜还是一样不行
 
高手帮忙!分数不够可以在加!
 
procedure TForm1.Button1Click(Sender: TObject);
var
ms: TMemoryStream;
Ism: IStream;
Data: IDataObject;
begin
ms:=TMemoryStream.Create;
ms.LoadFromFile('d:/gg.txt');
try
Ism := TStreamAdapter.Create(ms);
OleLoadFromStream(Ism,IUnknown ,Data); //?????!
// ......
finally
ms.Free;
end;

end;
 
把OleLoadFromStream(Ism,IUnknown ,Data);
改成OleCheck(OleLoadFromStream(Ism,IUnknown ,Data));你就知道什么错误了。
 
期待高手出现!
 
没有解决,我自己顶
 
OleVariant 包括 IDataObject
procedure StreamToVariant(var Data: OleVariant; Stream: TMemoryStream);
var
p: Pointer;
begin
Data := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(Data);
try
Stream.Position := 0;
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Data);
end;
end;
 

Similar threads

后退
顶部