Конвертировать Кардинал в Не знаю - PullRequest
1 голос
/ 29 ноября 2010

Я сейчас работаю над принятием кода 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, которые я сейчас перевожу, есть какая-то черная магия. Автор кода использует следующую визуальную базовую функцию для приведения указателей на интерфейсы ...

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 Ответ

3 голосов
/ 29 ноября 2010

Ваша переменная oleMedium объявлена ​​как TStgMedium. У него есть поле hGlobal, но также имеет поле stg типа Pointer. Используйте это поле и введите его в IStorage, когда вам нужно использовать интерфейс:

IStorage(oleMedium.stg)

У вашего автора VB не было приведения типов, поэтому код копировал память из одной переменной в другую.

...