将Cardinal转换为IUnknow

时间:2010-11-29 14:11:42

标签: delphi com vb6 ole

我正在努力将Visual Basic代码应用到Delphi代码中。

我有什么:

   // prepare query
   with oleClipboardFormat do
   begin
     cfFormat := CF_FileContents;
     ptd := nil;
     dwAspect := DVASPECT_CONTENT;
     lindex := Index;
     tymed := TYMED_ISTREAM or TYMED_ISTORAGE;
   end;

   // query data
   data.GetData(oleClipboardFormat, oleMedium)

字段oleMedium.hGlobal(变量类型为Cardinal)包含对IStorage接口的引用。

我应该如何将oleMedium.hGlobal投射到IStorage

我正在翻译的VB源代码中有某种黑魔法。代码的作者使用以下visual basic函数来编译指向接口的指针......

Private Function ResolvePointer(ByVal PtrObj As Long) As stdole.IUnknown
Dim oUnk As stdole.IUnknown

' Get an uncounted reference
' to the IUnknown interface
MoveMemory oUnk, PtrObj, 4&

' Get a counted reference
Set ResolvePointer = oUnk

' Release the uncounted reference
MoveMemory oUnk, 0&, 4&

End Function

1 个答案:

答案 0 :(得分:3)

您的oleMedium变量被声明为TStgMedium。它有一个hGlobal字段,但 还有一个stg字段,其类型为Pointer。使用该字段,并在需要使用界面时将其输入IStorage

IStorage(oleMedium.stg)

你的VB作者没有随意使用类型转换,因此代码将内存从一个变量复制到另一个变量。