2009-06-30 9 views
5

necesito para acceder a un servidor COM de terceros con el siguiente definición de interfaces (IDL):Python win32 com: cómo manejar el parámetro 'out'?

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

Como se puede ver, devuelve los valores a través de 3 [OUT] modificadores de parámetros. ¿Cómo manejar esto a través de python COM COM32 win? Por ejemplo, puedo crear un objeto y obtener de ella iDisplay:

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

cómo llamar a display.getFrameBuffer() por lo que funciona? He intentado de diferentes maneras, pero siempre es 'no coincidencia de tipos' en el segundo argumento ([out] para IFrameBuffer)

Respuesta

8

Dado que esos son los parámetros, ¿no puede simplemente hacer lo siguiente?

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

Hay algunas buenas referencias en Python Programming on Win32 Chapter 12 Advanced Python and COM

e indican que la sintaxis debe ser como la de arriba. También mencionan el uso de MakePy de objetos COM:

Hay una serie de buenas razones para utilizar MakePy: (Copiado del libro)

  • La interfaz de Python a la automatización objetos es más rápida para los objetos soportados por un módulo MakePy.

  • Las constantes definidas por la biblioteca de tipos están disponibles para el programa Python. Discutiremos las constantes COM en más detalle más adelante en el capítulo.

  • Hay una compatibilidad mucho mejor para los tipos de parámetros avanzados, específicamente, los parámetros declarados por COM como BYREF solo se pueden usar con objetos compatibles con MakePy. Discutimos pasar parámetros más adelante en el capítulo.

+0

Lo he intentado, plantea 'número inválido de parámetros'. No estoy seguro de cómo usar MakePy si el servidor COM es de terceros. Está instalado en el sistema como un binario y registra el servidor COM. ¿Es posible cambiar su API? – grigoryvp

3

utilizar el módulo makepy, la invocación de la siguiente manera:

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

Se abrirá una ventana con una lista de bibliotecas de tipos. Desplácese hasta "Biblioteca de tipo de cuadro virtual" y selecciónelo, luego haga clic en "Aceptar". Se creará un módulo de Python en una ubicación que se imprime (normalmente %TEMP%\gen_py\2.x\).

La clase generada será utilizada automáticamente por win32com.client.Dispatch, pero si la necesita explícitamente puede acceder a ella a través de funciones en el módulo win32com.client.gencache.

Cuestiones relacionadas