Pull to refresh

Comments 6

На всякий случай, на известной страничке www.lfd.uci.edu/~gohlke/pythonlibs уже собранный pywin32 имеется для всех (не сильно устаревших) вариантов питона.
Если нет IDispatch интерфейса, то самый универсальный вариант — pip install comtypes. И не нужно никакой компиляции. Единственный минус — на Py3.5 и Py3.6 не всегда работает, но фикс уже смерджили в мастер.
Не знал про comtypes, спасибо. Я попробую.
В описании к нему написано, что используется раннее связывание — берется описание интерфейса из IDL или type library и по нему генерится код на питоне. Для IPreviewHandler описания в type library нет, а IDL есть в WinSDK.
Попробовал описать интерфейс в питоне — увы, не получилось.

precomtypes.py
from comtypes import (IUnknown, STDMETHOD, HRESULT, GUID, CLSCTX_LOCAL_SERVER)

import comtypes.server as cs
import comtypes.client as cc
from ctypes import (POINTER, c_void_p)
from ctypes.wintypes import tagRECT, HWND, MSG


class IPreviewHandler(IUnknown):
    _case_insensitive_ = False
    _iid_ = GUID('{8895B1C6-B41F-4C1C-A562-0D564250836F}')
    _idlflags_ = []

    _methods_ = [
##        virtual HRESULT STDMETHODCALLTYPE SetWindow( 
##            /* [in] */ HWND hwnd,
##            /* [in] */ CRECTPTR prc) = 0;
        STDMETHOD(HRESULT, "SetWindow",
                  [HWND, POINTER(tagRECT)]),

##        virtual HRESULT STDMETHODCALLTYPE SetRect( 
##            /* [in] */ CRECTPTR prc) = 0;        
        STDMETHOD(HRESULT, "SetRect",
                  [POINTER(tagRECT)]),

##        virtual HRESULT STDMETHODCALLTYPE DoPreview( void) = 0;
        STDMETHOD(HRESULT, "DoPreview", []),

##        virtual HRESULT STDMETHODCALLTYPE Unload( void) = 0;        
        STDMETHOD(HRESULT, "Unload", []),

##        virtual HRESULT STDMETHODCALLTYPE SetFocus( void) = 0;
        STDMETHOD(HRESULT, "SetFocus", []),
                
##        virtual HRESULT STDMETHODCALLTYPE QueryFocus( 
##            /* [out] */ HWNDPTR phwnd) = 0;
        STDMETHOD(HRESULT, "QueryFocus",
                  [POINTER(HWND)]),

##        virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( 
##            /* [in] */ MSGPTR pmsg) = 0;
        STDMETHOD(HRESULT, "TranslateAccelerator",
                  [POINTER(MSG)])
        ]
    

obj = cc.CreateObject('{DC6EFB56-9CFA-464D-8880-44885D7DC193}',
                      clsctx = CLSCTX_LOCAL_SERVER,
                      interface=IPreviewHandler
                      )


Выдает ошибку:
Traceback (most recent call last):
  File "C:/Projects/pytest/precomtypes.py", line 48, in <module>
    clsctx = CLSCTX_LOCAL_SERVER #,
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\comtypes\client\__init__.py", line 238, in CreateObject
    obj = comtypes.CoCreateInstance(clsid, clsctx=clsctx, interface=interface)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\comtypes\__init__.py", line 1223, in CoCreateInstance
    _ole32.CoCreateInstance(byref(clsid), punkouter, clsctx, byref(iid), byref(p))
  File "_ctypes/callproc.c", line 918, in GetResult
OSError: [WinError -2147467259] Неопознанная ошибка

Возможно, в этом конкретном случае comtypes и бессилен (пардон, пока не вникал глубоко), но он точно умеет больше, чем win32com.client. Мы его используем, подгружая UIAutomationCore.dll, где тоже нет IDispatch.

не глючит просмотр pdf? у меня какие-то косяки начинались после десятка-другого просмотров из-за чего я его просто отключил…
Sign up to leave a comment.

Articles

Change theme settings