2010-11-29 39 views
1

Je travaille actuellement sur l'adoption du code Visual Basic dans le code Delphi.Convertir Cardinal en IUnknow

Ce que j'ai:

// 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) 

Le champ oleMedium.hGlobal (type de variable est Cardinal) contient une référence à l'interface IStorage. Comment puis-je diffuser oleMedium.hGlobal à IStorage?

Il y a une sorte de magie noire dans les sources VB que je traduis en ce moment. L'auteur du code utilise la fonction Visual Basic suivante pour lancer des pointeurs vers des interfaces ...

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 
+2

La prochaine fois, n'oubliez pas d'inclure les ** déclarations de variables ** avec votre code. J'ai dû faire un peu de recherche avant de comprendre ce que 'GetData' était et quels étaient ses types d'arguments. –

Répondre

3

votre variable oleMedium est déclarée comme TStgMedium. Il a un champ hGlobal, mais également a un champ stg, qui est de type Pointer. Utilisez ce champ et tapez-le jeter aux IStorage lorsque vous devez utiliser l'interface:

IStorage(oleMedium.stg) 

Votre VB auteur n'a pas eu transtypage à sa disposition, de sorte que le code mémoire copié à partir d'une variable à un autre.

+0

Merci pour votre temps. Je viens juste de remarquer qu'il vient de copier des addres d'une interface. – v00d00