我正在努力将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
答案 0 :(得分:3)
您的oleMedium
变量被声明为TStgMedium
。它有一个hGlobal
字段,但 还有一个stg
字段,其类型为Pointer
。使用该字段,并在需要使用界面时将其输入IStorage
:
IStorage(oleMedium.stg)
你的VB作者没有随意使用类型转换,因此代码将内存从一个变量复制到另一个变量。