2009-06-30 7 views
5

J'ai besoin d'accéder à un serveur COM tiers avec la définition suivante d'interface (IDL):Python win32 com: comment gérer le paramètre 'out'?

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

Comme vous pouvez le voir, il retourne 3 valeurs par [out] paramètres modificateurs. Comment gérer cela via python win32 COM api? Par exemple, je crée un objet et obtenir IDisplay de lui:

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

Comment appeler display.getFrameBuffer() donc il fonctionnera? J'ai essayé de différentes manières, mais c'est toujours "incompatibilité de type" sur le deuxième argument ([out] pour IFrameBuffer)

Répondre

8

Comme ce sont des paramètres de sortie, ne pouvez-vous pas simplement faire ce qui suit?

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

Il y a quelques bonnes références dans Python Programming on Win32 Chapter 12 Advanced Python and COM

Ils indiquent que la syntaxe doit être comme ci-dessus. Ils mentionnent également l'utilisation MakePy pour les objets COM:

Il y a un certain nombre de bonnes raisons d'utiliser MakePy: (copié du livre)

  • L'interface Python à l'automatisation des objets est plus rapide pour les objets pris en charge par un module MakePy.

  • Toutes les constantes définies par la bibliothèque de types sont mis à la disposition du programme Python. Nous discutons des constantes COM plus en détail plus loin dans le chapitre.

  • La prise en charge des types de paramètres avancés est nettement meilleure, en particulier, les paramètres déclarés par COM comme BYREF ne peuvent être utilisés qu'avec des objets pris en charge par MakePy. Nous discutons des paramètres de passage plus loin dans le chapitre.

+0

J'ai essayé, il soulève un 'nombre de paramètres invalide'. Je ne sais pas comment utiliser MakePy si le serveur COM est tiers. Il est installé sur le système en tant que binaire et enregistre le serveur COM. Est-il possible de changer son API? – grigoryvp

3

Utilisez le module makepy, invoquant comme suit:

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

Une fenêtre avec une liste des bibliothèques de types. Faites défiler jusqu'à "Virtual Box Type Library" et sélectionnez-le, puis cliquez sur "OK". Un module Python sera créé dans un emplacement qui est imprimé (généralement %TEMP%\gen_py\2.x\).

La classe générée sera automatiquement utilisée par win32com.client.Dispatch, mais si vous en avez besoin explicitement, vous pouvez y accéder via les fonctions du module win32com.client.gencache.

Questions connexes