ãããã®ãã¡ã€ã«ã®è¡šç€ºãããŒã¿ããŒã¹ã§åäœããç§ã®ããã°ã©ã ã«æ·»ä»ããããšãå¯èœãã©ããçåã«æã£ãŠããŸããã

äœããã®çç±ã§ããã®ãããªåé¡ã®èªç¶ãªè§£æ±ºçã¯ãéåžžãã³ãã³ãã©ã€ã³ã§ãã¡ã€ã«åãæå®ããŠMSWordãèµ·åããããšã§ãã ãããããã®æ¹æ³ã¯ãæ§ããã«èšã£ãŠããããŸãå®å šã§ã¯ãããŸãããããã¥ã¡ã³ãã«ãã¯ããããããããã¥ã¡ã³ãã§ã¯ãªããã¯ã©ãã«ãŒã«ãã£ãŠç¹å¥ã«æºåããããã¡ã€ã«ã§ããå¯èœæ§ããããŸãã ãããã£ãŠãOfficeã«å®è£ ãããŠããç¹å¥ãªè¡šç€ºãªããžã§ã¯ãã䜿çšããããšããå§ãããŸãã ããã¥ã¡ã³ãã衚瀺ãã以å€ã«äœãã§ããªããããããå®å šã§ãã
ãŸãã1ã€ã®ããã¥ã¡ã³ã圢åŒã«éå®ããªãå ŽåãããŒãã¹ãšããŠãWindowsã§æšæºã®ãã¥ãŒã¢ãç»é²ãããŠããä»ã®åœ¢åŒã®æ·»ä»ããã¥ã¡ã³ãã衚瀺ã§ããŸãã
ä»åŸã¯-PyWin32ã䜿çšããŠãã¹ãŠãå€æããŸããã 確ãã«ããã®ããã»ã¹ã§äºæããªãCOMã€ã³ã¿ãŒãã§ã€ã¹ããµããŒãããããã«ããã±ãŒãžãã³ã³ãã€ã«ããå¿ èŠããããŸããããç ç²è ã¯ããŸããã§ããã
ã ããç§ãã¡ã¯äœãç¥ã£ãŠããŸãã
- MSDNã«ãããšãã·ã¹ãã ã«ã¯æšæºã®IPreviewHandlerã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããã¥ãŒã¢ãŒããããã€ã³ã¿ãŒãã§ã€ã¹ã¯Shobjidl.hã€ã³ã¯ã«ãŒããŒã§èª¬æãããŠããŸã
- ç¹å®ã®ãã¡ã€ã«æ¡åŒµåã«ã€ããŠã·ã¹ãã ã«ç»é²ããããã¥ãŒã¢ããããã©ããã確èªã§ããŸã-ãã©ã³ããããå Žåã¯HKEY_CLASSES_ROOT \ <extn> \ Shellex \ {8895b1c6-b41f-4c1c-a562-0d564250836f} ïŒã <extn> ãã¯ãããä»ãã®ãã¡ã€ã«æ¡åŒµåãã€ãŸããã. doc ããã. pdf ããªã©ïŒãããã©ã«ãå€ãããããã®å€ã¯å¯Ÿå¿ããã³ã³ããŒãã³ãã®CLSIDã§ãã
- ç»é²ãããŠãããã¹ãŠã®ãã¥ãŒã¢ã¯ãã¬ãžã¹ããªãã©ã³ãHKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ PreviewHandlersã«ãªã¹ããããŠããŸãã
äœæ¥æ瀺æžïŒ
4.ãã£ã¹ã¯äžã«ããã¥ã¡ã³ãããããŸãã
5.ãã¡ã€ã«æ¡åŒµåããCLSIDãèŠã€ããããã䜿çšããŠãã¥ãŒã¢ãŒãªããžã§ã¯ããäœæããŸãã
6.ååãŸãã¯IStreamã¹ããªãŒã ã®ããããã§ããã¡ã€ã«ã䜿çšããŠãªããžã§ã¯ããåæåããŸããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã
7. SetWindowã¡ãœãããåŒã³åºããŠããªããžã§ã¯ãã«è¡šç€ºãããŠã£ã³ããŠããªããžã§ã¯ãã«ç€ºããŸããããã§ã¯ãŠã£ã³ããŠãã³ãã«ãå¿ èŠã§ãããåé¡ã¯ãããŸãããQtãŠã£ãžã§ããã«ã¯ããã®ããã®winIdïŒïŒã¡ãœããããããŸãã
8.衚瀺ãéå§ããã«ã¯ããªããžã§ã¯ãã§DoPrevewã¡ãœãããåŒã³åºããŸãã
9.ãŠã£ã³ããŠã®ãµã€ãºãå€æŽããå Žåã¯ãSetRectãåŒã³åºããŠãããã«å¿ããŠãã¥ãŒã®ãµã€ãºãå€æŽããå¿ èŠããããŸãã
10.ãã¥ãŒã¢ãäžèŠã«ãªã£ããšã-ã¢ã³ããŒããšåŒã³ãŸã
CLSIDã䜿çšããŠã³ã³ããŒãã³ããäœæããã«ã¯ãPythonãPythonã§ã©ãã»ã©ç°¡åãã調ã¹ãå¿ èŠããããŸãïŒ Pythonããã°ã©ã ããããšã¯ãŸã èšããŸãããïŒïŒã
Stack Overflowã§ã¯ããã®ãããªããšã®ããã«PyWin32ãã€ã³ã¹ããŒã«ããããšããå§ãããŸãã ã§ã¯ãè©ŠããŠã¿ãŸãããã
C:\>pip3 install pywin32 Collecting pywin32 Could not find a version that satisfies the requirement pywin32 (from versions: ) No matching distribution found for pywin32
ãªã«...ïŒ ãããŒãžã§ã³ãèŠã€ãããªãããšããæå³ã§ã¯ïŒ
åã³ã°ãŒã°ã«-ã¯ãããpypiwin32ããã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
Pypiwin32ã¯ãå¥å šãªããã±ãŒãžããŒã«ïŒã€ãŸãã
ãã€ãŒã«ïŒã Twistedãããžã§ã¯ãã®BDFLã«ãã£ãŠåããã±ãŒãžåãããŸããã 䜿çšããå Žå
pipããŸãã¯virtualenvsïŒãããŠãããããªãã
éå§ããªãïŒãpypiwin32ã䜿çšããŸãã
C:\>pip3 install pypiwin32
é ä¿¡æžã¿ã ãç²ãæ§ã§ããïŒ
確èªããå¿ èŠããããŸããå°ããªã¹ã¯ãªãããæžããŠããŸãã
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pythoncom import pywintypes adobe = pywintypes.IID('{DC6EFB56-9CFA-464D-8880-44885D7DC193}') CLSID_IPreviewHandler = '{8895B1C6-B41F-4C1C-A562-0D564250836F}' iid = pywintypes.IID(CLSID_IPreviewHandler) handler = pythoncom.CoCreateInstance( adobe, None, pythoncom.CLSCTX_LOCAL_SERVER, iid) print(handler)
ããã§ã¯ãã·ã¹ãã ã§äœ¿çšã§ãããã¥ãŒã¢ã®1ã€ãç¹ã«Adobe pdfãäœæããŸãã ãã以äžã®ã¢ã¯ã·ã§ã³ãªãã§ãåçŽã«äœæãããŸãã åäœããå Žåã¯ããã®ã¡ãœããããã«ã§ããŸãã
ç«ã¡äžããŠããšãŠãé©ããŸãã
Traceback (most recent call last): File "C:\Projects\pytest\w1.py", line 19, in <module> iid) TypeError: There is no interface object registered that supports this IID
ã€ãŸãã圌ã¯ãã¥ãŒã¢ãäœæããŸãããããããè¿ãããšãã§ããŸããã§ãã-ãããã圌ã¯ent IIDããµããŒãããç»é²æžã¿ã€ã³ã¿ãŒãã§ãŒã¹ãªããžã§ã¯ããæã£ãŠããŸãã
ããã€ãã®ç¹ã§ãç§ã¯åœŒã«åæããŸã-Pythonã¯ãäœæãããCOMãªããžã§ã¯ãã«ã¡ãœãããããããšãç¥ã£ãŠãPythonã¹ã¯ãªããããåŒã³åºããããã«ããå¿ èŠããããŸãã ãã®æ å ±ã¯IDispatchã€ã³ã¿ãŒãã§ãŒã¹ã«ãã£ãŠæäŸãããŸããããã®ãªããžã§ã¯ãã«ã¯ãããŸãã...
ããã§ã¯ã©ãããŸããïŒ ãšã©ãŒã¡ãã»ãŒãžã®ããã¹ããã°ãŒã°ã«ã§æ€çŽ¢ãããšã Mark Hammond ããã±ãŒãžã®éçºè ã®çããèŠã€ãããŸãã
>ããã¥ã¡ã³ãPythonCOM.htmlã¯ãããããpydãã¢ãžã¥ãŒã«ã䜿çšããŠè¡ããããšè¿°ã¹ãŠããŸã
>ãã€ã³ããŒããããŸãã ããã¯ãã¢ã¯ã»ã¹ããããã¹ãŠã®ã€ã³ã¿ãŒãã§ãŒã¹ã«å¯ŸããŠ
>ãã®æ¹æ³ã§ã¯ãCãŸãã¯C ++ã¢ãžã¥ãŒã«ããã®ããã«ç¹å¥ã«äœæããå¿ èŠããããŸã
>ã€ã³ã¿ãŒãã§ãŒã¹ïŒ
ãŸãã«ã ãã ããå€ãã®äŸ¿å©ãªãªããžã§ã¯ãããIDispatchãã䜿çšããããšã«æ³šæããŠãã ãã
ã€ã³ã¿ãŒãã§ã€ã¹ããããããããªãã«ã¹ã¿ã ãªããžã§ã¯ãã®å Žåãããã¯æ¬åœã§ãã
>ãããå¿ èŠãªå ŽåãäŸãèŠãããšãã§ããå Žæã¯ãããŸãã
>ãã®ã¢ãžã¥ãŒã«ã®ã³ãŒãã®ïŒ ããã§ãªãå Žåã¯ãã©ã®ããã«Pythonã«äŒããã®ã§ããïŒ
> IIDã«é¢é£ä»ããããã€ã³ã¿ãŒãã§ã€ã¹ãªããžã§ã¯ãïŒ
win32comã®ãœãŒã¹ã«ã¯å€ãã®äŸããããŸãã æã
æè¿ã®ã»ããã¯ãinternetãããã³ãaxcontrolsããã£ã¬ã¯ããªã«ãããŸãã
ãŸããCã³ãŒããçæããããã®2ã€ã®ãªãã·ã§ã³ãããããšã«æ³šæããŠãã ããã äž
win32comã«ä»å±ããŠãããmakegwãã䜿çšããããšã§ã-.hãã¡ã€ã«ãåããŸã
ããèªäœãIDLãã¡ã€ã«ããçæãããCãœãŒã¹ãäœæããŠãã
ã³ãŒãã ããããããã»ã©æè»ã§ã¯ãããŸããã SWIGããããŸãã
ããæè»ã§ãããããããèšå®ããããã®ã¯ããã«é«ãåŠç¿æ²ç·ã
ã€ã³ã¿ãŒãã§ã€ã¹ãå°ãããIDLããçæããã.Hãã¡ã€ã«ã«ããå Žåã
次ã«ããmakegwããšç§ãèšåãããµã³ãã«ïŒããã¯
makepyã§çæãããå ŽæèªäœïŒ
èŠããã«ãå€ãè¯ãC.ã€ã³ã¯ã«ãŒããŒãã³ã³ãã€ã©ããªã³ã«ã§é£ã¶ããšãç³ãåºãŸã-ããã ãã§ãPythonã«æ®ããŠãé¿ããããšæããŸããã ãããŠããœãŒã¹ããã±ãŒãžããäŸãåããŸãã ç§ã¯ãœãŒã¹ãããŠã³ããŒãããŠããã䟿å©ã«ãªããŸããã
ãããŠ2ã€ã®çµã¿ç«ãŠãªãã·ã§ã³
- ããã±ãŒãžã«å«ãŸãããMakegwã
- ãã涌ããSWIG
SWIGã«ã€ããŠã¯ããã " PythonãModulesãSWIGãWindows " mclanderã«é¢ããèšäºããããŸãããããã§ã¯ããã¹ãŠãçŽ æŽããã ãç°¡åã§ãã¯ãŒã«ã ãšæãããŸãã ç§ã¯ãã®SWIGãããŠã³ããŒããããããç解ããããšããŸãã-ããã«è§£æ±ºããŸããã§ããããmakegwã§å€æããŸããã
makegwã¯ãå¿ èŠãªãã©ã¡ãŒã¿ãŒïŒãã®å Žåã¯Windows SDKããã®ShObjIdl.hãžã®ãã¹ãããã³å¿ èŠãªã€ã³ã¿ãŒãã§ã€ã¹ïŒã䜿çšããŠå®è¡ããå¿ èŠãããå®è³ªçã«1ã€ã®é¢æ°ãæã€ã¢ãžã¥ãŒã«ã§ããããã§ãã¹ã¯ãªãããäœæããŸããã
mk.py
import win32com.makegw.makegw inc = "C:/Program Files (x86)/Windows Kits/10/Include/10.0.14393.0/um/" h = inc + "ShObjIdl.h" win32com.makegw.makegw.make_framework_support(h, "IPreviewHandler")
ã¹ã¯ãªããã¯æ©èœãã2ã€ã®ãã¡ã€ã«PyIPreviewHandler.cppãšPyIPreviewHandler.hãå€æããŸããã ãªãŒãããŒãèŠããŠã¿ããšããã®åçãèŠããŸãã
// *** The input argument hwnd of type "__RPC__in HWND" was not processed *** // Please check the conversion function is appropriate and exists! __RPC__in HWND hwnd; PyObject *obhwnd; // @pyparm <o Py__RPC__in HWND>|hwnd||Description for hwnd
// *** The input argument prc of type "__RPC__in const RECT *" was not processed *** // Please check the conversion function is appropriate and exists! __RPC__in const RECT prc; PyObject *obprc; // @pyparm <o Py__RPC__in const RECT>|prc||Description for prc
ã€ãŸããmakegwã¯ãã__ RPC__in HWNDããã__ RPC__in const RECT *ããªã©ã®æå³ãäœã§ããããç解ã§ãããç解ããããšããŸããã§ããã ç§ãèŠåããããšã
ã³ã³ãã€ã«ããããšããŠãæãã ã£ãã®ã§ãç§ãèªåã®æãæ¯é ããããªãã£ãã®ã§ãåé¡ãåé¿ããããšããŸãã-ãããã®æ§é ãåé³ç¯ã®åçç©ã«çœ®ãæããŠãã ããã
ShObjIdl.hãååŸããIPreviewHandlerã€ã³ã¿ãŒãã§ã€ã¹ã®èª¬æãããããå¥ã®ãã¡ã€ã«ã«åãåºãããã©ã¡ãŒã¿ãŒã®ã¿ã€ããå€æŽããŸããã
preview.h
#include "rpc.h" #include "rpcndr.h" #include "windows.h" #include "ole2.h" //#define __RPC__in #ifndef __IPreviewHandler_INTERFACE_DEFINED__ #define __IPreviewHandler_INTERFACE_DEFINED__ /* interface IPreviewHandler */ /* [uuid][object] */ #include "prtypes.h" EXTERN_C const IID IID_IPreviewHandler; MIDL_INTERFACE("8895b1c6-b41f-4c1c-a562-0d564250836f") IPreviewHandler : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE SetWindow( /* [in] */ HWND hwnd, /* [in] */ CRECTPTR prc) = 0; virtual HRESULT STDMETHODCALLTYPE SetRect( /* [in] */ CRECTPTR prc) = 0; virtual HRESULT STDMETHODCALLTYPE DoPreview( void) = 0; virtual HRESULT STDMETHODCALLTYPE Unload( void) = 0; virtual HRESULT STDMETHODCALLTYPE SetFocus( void) = 0; virtual HRESULT STDMETHODCALLTYPE QueryFocus( /* [out] */ HWNDPTR phwnd) = 0; virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( /* [in] */ MSGPTR pmsg) = 0; }; #endif
å¥ã®ãã¡ã€ã«ã«èšè¿°ãããæ°ããã¿ã€ã
prtypes.h
typedef const RECT *CRECTPTR; typedef const MSG *CMSGPTR; typedef MSG *MSGPTR; typedef HWND *HWNDPTR;
ãããã£ãŠãã¹ã¯ãªããã§ã¯ãã€ã³ã¯ã«ãŒããŒã®ååãå€æŽããŸããã åæã«ãã²ãŒããŠã§ã€ãªããžã§ã¯ãã®çæããªãã«ããŸãããå®éã«ã¯ãå®è£ ãããã€ã³ã¿ãŒãã§ã€ã¹ãå€éšã©ã€ãã©ãªããååŸããPythonã§äœæããªããããçæã«é¢äžããã²ãŒããŠã§ã€ã¯å¿ èŠãããŸããã
mk.py
import win32com.makegw.makegw win32com.makegw.makegw.make_framework_support("preview.h", "IPreviewHandler", bMakeGateway = 0)
ç«ã¡äžããŸãã
C:\Projects\pytest>python mk.py IPreviewHandler
ãã®ãããããã±ãŒãžãåéããå¿ èŠããããŸãã Pythonã§ããã¥ã¡ã³ããã¹ã¢ãŒã¯ããåŸãã¢ã»ã³ããªïŒ ãããšãã ïŒã§setup.pyã¹ã¯ãªãããäœæããããšãå¿ èŠã§ååã§ããããšãããããŸããã ããããæ¢ã«ãåç¥ã§ãããããããã±ãŒãžãäœæãããšããæå³ã§ã¯ããããåããŠã§ãã äœãããŠãã ããã
#!/usr/bin/env python from distutils.core import setup, Extension pypacks = "C:/Python/Lib/site-packages/" wdkinc = "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.14393.0\\" wdklib = "C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.14393.0\\" pywinsrc = "C:/Projects/Source/pywin32-221/" example_module = Extension('_preview', sources=['PyIPreviewHandler.cpp','prtypes.cpp'], include_dirs=[wdkinc + "ucrt", pywinsrc + "com/win32comext/shell/src", pypacks + "win32/include", pypacks + "win32com/include"], library_dirs=[wdklib + "ucrt\\x86", pypacks + "win32/libs", pypacks + "win32com/libs"] ) setup (name = 'preview', version = '0.1', author = "My", description = """Simple swig example from docs""", ext_modules = [example_module], py_modules = ["preview"], )
ãã·ã³ã«Windows SDKïŒããæ£ç¢ºã«ã¯WDKããããŸãããååã§ã¯ãããŸããïŒãšVisual Studio Community 2017ãæ¢ã«ãããsetup.pyãããããèŠã€ãããã©ããçåã«æããŸããã ã³ã³ãã€ã©èªäœãèŠã€ãããSDKãã¹ãæå®ããå¿ èŠããããŸããã
C:\Projects\pytest>python.exe setup.py build_ext --inplace >err.txt error: command 'D:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\cl.exe' failed with exit status 2
ãã¡ãããäžç·ã«ã¯ãªããŸããã§ããããåããŠåéããããšã¯æã£ãŠããŸããã§ããã ãšã©ãŒã®ã¯ãªã¢ïŒ
PyIPreviewHandler.cpp(46): error C3861: 'PyObject_AsCRECTPTR': identifier not found
以åã¯æ°ããããŒã¿åãå®çŸ©ããŠããŸãããããããã®åã®ããŒã¿ãpythonãªããžã§ã¯ãããCã«ããŸãã¯ãã®éã«å€æããé¢æ°ãå¿ èŠã«ãªããŸããã ãœãŒã¹ããPyWin32ãæ€çŽ¢ããåŸãé¢æ°å ã®PyObject_AsRECTãPyObject_FromRECTãªã©ããã€ãŸãå¿ èŠãªãã®ããã¹ãŠèŠã€ãããŸããã ãããã®æ©èœã䜿çšããã«ã¯ãçæããããªãŒãããŒãä¿®æ£ããå¿ èŠããããŸããã
ããã¯ïŒ
CRECTPTR prc; PyObject *obprc; ... if (bPythonIsHappy && !PyObject_AsCRECTPTR( obprc, &prc )) bPythonIsHappy = FALSE; ... PyObject_FreeCRECTPTR(prc);
次ã®ããã«ãªããŸããïŒ
RECT prc; PyObject *obprc; ... if (bPythonIsHappy && !PyObject_AsRECT( obprc, &prc )) bPythonIsHappy = FALSE; ... //PyObject_FreeCRECTPTR(prc);
ãªã©ãIPreviewHandlerã®å©ç¹ã¯ããã»ã©å€ããããŸããã ãã ããå€æé¢æ°ã¯PyWin32ã®ã©ã€ãã©ãªã«è»¢éãããªãããããœãŒã¹ãããã«ããŠprtypes.cppãã¡ã€ã«ã«æ¿å ¥ããå¿ èŠããããŸããã
prtypes.cpp
#include "shell_pch.h" #include "prtypes.h" BOOL PyObject_AsMSG( PyObject *obpmsg, MSG *msg ) { PyObject *obhwnd; return PyArg_ParseTuple(obpmsg, "Oiiii(ii)", &obhwnd,&msg->message,&msg->wParam,&msg->lParam,&msg->time,&msg->pt.x,&msg->pt.y) && PyWinObject_AsHANDLE(obhwnd, (HANDLE *)&msg->hwnd); } PyObject *PyObject_FromMSG(const MSG *msg) { if (!msg) { Py_INCREF(Py_None); return Py_None; } return Py_BuildValue("Niiii(ii)", PyWinLong_FromHANDLE(msg->hwnd),msg->message,msg->wParam,msg->lParam,msg->time,msg->pt.x,msg->pt.y); } BOOL PyObject_AsRECT( PyObject *ob, RECT *r) { return PyArg_ParseTuple(ob, "iiii", &r->left, &r->top, &r->right, &r->bottom); } PyObject *PyObject_FromRECT(const RECT *r) { if (!r) { Py_INCREF(Py_None); return Py_None; } return Py_BuildValue("iiii", r->left, r->top, r->right, r->bottom); }
ããããä»ã§ã¯ãœãŒã¹ã«é Œããã«ã³ã³ãã€ã«ããŸãã ã³ã³ãã€ã«ãããŸãããã¢ã»ã³ãã«ãããŸããã
LINK : error LNK2001: unresolved external symbol PyInit__preview build\temp.win32-3.6\Release\_preview.cp36-win32.lib : fatal error LNK1120: 1 unresolved externals
äœãèšãããªãã£ãããã«æããŸãã
PyInit_xxx
ã¯ã¢ãžã¥ãŒã«ãåæåããããã®æšæºåã®ããã«èŠããŸãããå¯äžã®è³ªåã¯ãã®äžã«ããã¹ããã®ãã€ã³ã¿ãŒãã§ãŒã¹ã®ç»é²æ¹æ³ã§ãã ç§ã¯PyWin32ãœãŒã¹ãåã³è§£ãæãããå®å šãªãã«ãã«å¿ èŠãªãã®ãææ¡ããªããã°ãªããŸããã§ããã èŠã€ãã£ãé¢æ°ãšã®é¡æšã«ãããPyInit_xxxã¯ç¬èªã®é¢æ°ãè¿œå ããŸããã
#include "PythonCOMRegister.h" // For simpler registration of IIDs ... // static struct PyMethodDef preview_methods[] = {{NULL}}; PyObject *PyInit__preview(void) { static PyModuleDef _preview_def = { PyModuleDef_HEAD_INIT, "_previewer", "Preview Handler Interface", -1, preview_methods }; PyObject *module=PyModule_Create(&_preview_def); // PyCom_RegisterClientType(&PyIPreviewHandler::type, &IID_IPreviewHandler); return module; }
ããã§ã
_preview.cp36-win32.pyd
ãã¡ã€ã«
_preview.cp36-win32.pyd
ïŒãããŠãããã§Stirlitzã¯äžç·ãäžèŠã§ãããšæšæž¬ããŸããïŒã çµæã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
C:\Projects\pytest>python.exe setup.py install
ãã§ãã¯-ã€ã³ããŒãåŸã®åããã¹ãã¹ã¯ãªããã§ã
import _preview
è¿œå ããã ã
ã¹ã¯ãªããå
šäœ
<source lang="python">#!/usr/bin/python3 # -*- coding: utf-8 -*- import pythoncom import pywintypes import _preview adobe = pywintypes.IID('{DC6EFB56-9CFA-464D-8880-44885D7DC193}') CLSID_IPreviewHandler = '{8895B1C6-B41F-4C1C-A562-0D564250836F}' iid = pywintypes.IID(CLSID_IPreviewHandler) handler = pythoncom.CoCreateInstance( adobe, None, pythoncom.CLSCTX_LOCAL_SERVER, iid) print(handler)
ç§ã¯èµ·åããŠååŸããŸãïŒ
C:\Projects\Python\test>python wincom.py <PyIPreviewHandler at 0x00817770 with obj at 0x00745FFC>
ãã ããåäœãããªããžã§ã¯ãã¯äœæãããŸããã
æå³ããç®çã§è£œåã䜿çšããããšã¯å€ãããŸããã ããŸããŸãªããã¥ã¡ã³ã圢åŒã確èªããããã«ãPyQt5ã®QFileSystemModelãšQTreeViewã䜿çšããŠã¹ã¯ãªãããäœæããŸããã å·ŠåŽã«ãã¡ã€ã«ã·ã¹ãã ããªãŒããããå³åŽã«éžæãããã¡ã€ã«ã®ãã¬ãã¥ãŒããããŸãã

ã¹ã¯ãªããã¯æ¬¡ã®ãšããã§ãã è¡ããšã«è§£æããã®ã¯ååç°¡åã§ããIPreviewHandlerã䜿çšããå€ãã®ã€ã³ã¿ãŒãããã®äŸãšã¯ç°ãªãããã¡ã€ã«ãã¡ã¢ãªã«èªã¿èŸŒãŸãªãããIInitializeWithFileã€ã³ã¿ãŒãã§ã€ã¹ïŒååšããå ŽåïŒãä»ããŠãã¥ãŒã¢ã§çŽæ¥éããŸãããŸãã¯ãæšæºã¹ããªãŒã ãäœæããŸãã SHCreateStreamOnFileExé¢æ°ã䜿çšããWinAPIïŒ PyWin32ã§ããµããŒããããŠããããšãå€æïŒããã³ãã®ã¹ããªãŒã ãIInitializeWithStreamã€ã³ã¿ãŒãã§ã€ã¹ã«æž¡ããŸã-åãã¥ãŒã¢ãŒã«ã¯2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã®ããããããããŸãã
filepreview.py
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pythoncom, win32comext import win32comext.propsys.propsys as propsys import win32comext.shell.shell as shellext import pywintypes import _preview from PyQt5.QtCore import * from PyQt5.QtWidgets import * CLSID_IPreviewHandler = '{8895B1C6-B41F-4C1C-A562-0D564250836F}' iid = pywintypes.IID(CLSID_IPreviewHandler) class PreviewWin(QWidget): def __init__(self, parent=None): super().__init__(parent) self.handler = None self.isFirst = True self.topLay = QHBoxLayout(self) self.splitter = QSplitter(self) self.topLay.addWidget(self.splitter) self.model = QFileSystemModel(self) self.model.setRootPath(QDir.currentPath()) self.tree = QTreeView(self.splitter) self.tree.setModel(self.model) cur = self.model.index(QDir.currentPath()) self.tree.setCurrentIndex(cur) self.tree.expand(cur) self.view = QWidget() self.splitter.addWidget(self.tree) self.splitter.addWidget(self.view) self.tree.clicked.connect(self.previewIndex) self.tree.setColumnWidth(0, 200) self.setWindowState(Qt.WindowMaximized) def resizeEvent(self, event): super().resizeEvent(event) if self.handler: self.handler.SetRect(self.view.rect().getRect()); def previewIndex(self, index): try: if self.handler: self.handler.Unload() self.handler = None if not index.isValid(): return filePath = QDir.toNativeSeparators(self.model.filePath(index)) ext = self.model.fileInfo(index).suffix() regPath = "HKEY_CLASSES_ROOT\\." + ext + "\\shellex\\" + CLSID_IPreviewHandler sets = QSettings(regPath, QSettings.NativeFormat) if not sets.contains("."): return classId = sets.value(".") if not classId: return self.handler = pythoncom.CoCreateInstance(classId, None, pythoncom.CLSCTX_LOCAL_SERVER, iid) if not self.handler: return STGM_READ = 0 try: iwfile = self.handler.QueryInterface(propsys.IID_IInitializeWithFile) except: iwfile = None if iwfile: try: iwfile.Initialize(filePath, STGM_READ) except: iwfile = None if not iwfile: try: iwstream = self.handler.QueryInterface(propsys.IID_IInitializeWithStream) except: print(str(sys.exc_info()[1])) iwstream = None if iwstream: iis = shellext.SHCreateStreamOnFileEx(filePath,STGM_READ,0,False) if iis: iwstream.Initialize(iis, STGM_READ) else: return else: print("Can't initialize preview for",filePath) return r = self.view.rect().getRect() self.handler.SetWindow(self.view.winId(), r); self.handler.DoPreview(); self.handler.SetFocus(); except: print(str(sys.exc_info()[1])) if __name__ == '__main__': import sys app = QApplication(sys.argv) w = PreviewWin() w.show() sys.exit(app.exec_())
ãã¹ãŠã®ãã¡ã€ã«ã¯Githubã§æããããŸããŠããŸãã