2009-06-30 10 views
5

muszę uzyskać dostęp do serwera COM z innymi firmami z następujących definicji interfejsu (IDL):Python win32 com: jak obsłużyć parametr "out"?

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

Jak widać, zwraca 3 wartości przez [out] modyfikatory parametrów. Jak radzić sobie z tym za pośrednictwem python win32 COM api? Na przykład, utworzyć obiekt i uzyskać od niego IDisplay:

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

Jak wywołać display.getFrameBuffer(), więc to będzie działać? Próbowałem na różne sposoby, ale zawsze jest "niezgodność typów" na drugi argument ([out] dla IFrameBuffer)

Odpowiedz

8

Ponieważ są to parametry out, nie możesz po prostu wykonać następujące czynności?

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

Jest kilka dobrych odniesienia w Python Programming on Win32 Chapter 12 Advanced Python and COM

I wskazują, że składnia powinna być jak wyżej. Wspominają również używając MakePy dla obiektów COM:

Istnieje wiele dobrych powodów, aby korzystać z MakePy: (skopiowane z książki)

  • Interfejs Python do automatyzacji obiektów jest szybsza dla obiektów poparte moduł MakePy.

  • Wszelkie stałe zdefiniowane przez bibliotekę typów są udostępniane programowi Python. Omówimy stałe COM bardziej szczegółowo w dalszej części rozdziału.

  • Istnieje znacznie lepsza obsługa zaawansowanych typów parametrów, w szczególności parametry zadeklarowane przez COM jako BYREF mogą być używane tylko z obiektami obsługiwanymi przez MakePy. Omówimy parametry przejściowe w dalszej części rozdziału.

+0

Próbowałem, podnosi "niepoprawną liczbę parametrów". Nie wiem, jak używać MakePy, jeśli serwer COM jest stroną trzecią. Jest zainstalowany w systemie jako plik binarny i rejestruje serwer COM. Czy można zmienić jego API? – grigoryvp

3

pomocą modułu makepy, powołując się go w następujący sposób:

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

Otworzy się okno z listą bibliotek typów. Przewiń do "Virtual Box Type Library" i zaznacz ją, a następnie kliknij "OK". Moduł Pythona zostanie utworzony w miejscu, które zostanie wydrukowane (zazwyczaj %TEMP%\gen_py\2.x\).

Wygenerowana klasa zostanie automatycznie użyta przez win32com.client.Dispatch, ale jeśli potrzebujesz jej jawnie, możesz uzyskać do niej dostęp za pośrednictwem funkcji modułu win32com.client.gencache.

Powiązane problemy