2009-06-30 8 views
5

Ho bisogno di accedere a un server COM di terze parti con seguente definizione di interfaccia (IDL):Python win32 com: come gestire il parametro 'out'?

interface IDisplay : IDispatch 
{ 
    HRESULT getFramebuffer (
    [in] ULONG aScreenId, 
    [out] IFramebuffer * * aFramebuffer, 
    [out] LONG * aXOrigin, 
    [out] LONG * aYOrigin); 
}; 

Come si può vedere, si restituisce 3 valori tramite [out] modificatori parametri. Come gestirlo tramite python win32 COM api? Per esempio, io creo un oggetto e ottenere IDisplay da esso:

object = win32com.client.Dispatch("VirtualBox.VirtualBox") 
display = object.display 

come chiamare display.getFrameBuffer() in modo che funzionerà? Ho provato diversi modi, ma è sempre 'tipo mancata corrispondenza' sul secondo argomento ([out] per IFrameBuffer)

risposta

8

Poiché questi parametri sono fuori, non si può semplicemente fare quanto segue?

Framebuffer, XOrigin, YOrigin = display.getFrameBuffer(ScreenId) 

Ci sono alcune buone referenze in Python Programming on Win32 Chapter 12 Advanced Python and COM

e indicano che la sintassi dovrebbe essere come sopra. Essi citano anche utilizzando Makepy per gli oggetti COM:

Ci sono una serie di buoni motivi per usare Makepy: (copiato dal libro)

  • L'interfaccia Python per oggetti di automazione è più veloce per gli oggetti supportati da un modulo MakePy.

  • Tutte le costanti definite dalla libreria dei tipi sono rese disponibili per il programma Python. Discuteremo le costanti COM in modo più dettagliato più avanti nel capitolo.

  • C'è un supporto molto migliore per i tipi di parametri avanzati, in particolare, i parametri dichiarati da COM come BYREF possono essere utilizzati solo con oggetti supportati da MakePy. Discutiamo i parametri di passaggio più avanti nel capitolo.

+0

Ho provato, genera "numero di parametri non valido". Non sono sicuro di come utilizzare MakePy se il server COM è di terze parti. È installato sul sistema come un server COM binario e registra. È possibile cambiare la sua API? – grigoryvp

3

utilizzare il modulo makepy, invocando come segue:

>>> import win32com.client.makepy as makepy 
>>> makepy.main() 

Si aprirà una finestra con un elenco di librerie dei tipi. Scorrere fino a "Virtual Box Type Library" e selezionarlo, quindi fare clic su "OK". Un modulo Python verrà creato in una posizione stampata (in genere %TEMP%\gen_py\2.x\).

La classe generata verrà automaticamente utilizzata da win32com.client.Dispatch, ma se è necessaria in modo esplicito è possibile accedervi tramite le funzioni nel modulo win32com.client.gencache.

Problemi correlati