From 97445e8ae07a67f8a9205e6eb3feeb16709d7654 Mon Sep 17 00:00:00 2001 From: junkmd Date: Sat, 22 Feb 2025 19:57:31 +0900 Subject: [PATCH 1/7] Replace `ctypes.byref` with `byref` in `client/_events.py`. --- comtypes/client/_events.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/comtypes/client/_events.py b/comtypes/client/_events.py index df59a652..081f639e 100644 --- a/comtypes/client/_events.py +++ b/comtypes/client/_events.py @@ -2,7 +2,7 @@ import logging import traceback from _ctypes import COMError -from ctypes import HRESULT, POINTER, WINFUNCTYPE, OleDLL, Structure, WinDLL +from ctypes import HRESULT, POINTER, WINFUNCTYPE, OleDLL, Structure, WinDLL, byref from ctypes.wintypes import ( BOOL, DWORD, @@ -82,7 +82,7 @@ def _connect( self, source: IUnknown, interface: Type[IUnknown], receiver: _ReceiverType ) -> None: cpc = source.QueryInterface(IConnectionPointContainer) - self.cp = cpc.FindConnectionPoint(ctypes.byref(interface._iid_)) + self.cp = cpc.FindConnectionPoint(byref(interface._iid_)) logger.debug("Start advise %s", interface) # Since `POINTER(IUnknown).from_param`(`_compointer_base.from_param`) # can accept a `COMObject` instance, `IConnectionPoint.Advise` can @@ -364,7 +364,7 @@ def HandlerRoutine(dwCtrlType): int(timeout * 1000), len(handles), handles, - ctypes.byref(ctypes.c_ulong()), + byref(ctypes.c_ulong()), ) except WindowsError as details: if details.winerror != RPC_S_CALLPENDING: # timeout expired From 36edc04b65b48106ffdbff9ca2063f65d760e73a Mon Sep 17 00:00:00 2001 From: junkmd Date: Sat, 22 Feb 2025 19:57:31 +0900 Subject: [PATCH 2/7] Replace `import comtypes.typeinfo` with specific imports in `client/_events.py`. --- comtypes/client/_events.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/comtypes/client/_events.py b/comtypes/client/_events.py index 081f639e..958eaaf1 100644 --- a/comtypes/client/_events.py +++ b/comtypes/client/_events.py @@ -17,12 +17,12 @@ from typing import Union as _UnionT import comtypes -import comtypes.typeinfo from comtypes import COMObject, IUnknown from comtypes._comobject import _MethodFinder from comtypes.automation import DISPATCH_METHOD, IDispatch from comtypes.client._generate import GetModule from comtypes.connectionpoints import IConnectionPoint, IConnectionPointContainer +from comtypes.typeinfo import IProvideClassInfo2 logger = logging.getLogger(__name__) @@ -114,7 +114,7 @@ def FindOutgoingInterface(source: IUnknown) -> Type[IUnknown]: # If the COM object implements IProvideClassInfo2, it is easy to # find the default outgoing interface. try: - pci = source.QueryInterface(comtypes.typeinfo.IProvideClassInfo2) + pci = source.QueryInterface(IProvideClassInfo2) guid = pci.GetGUID(1) except COMError: pass From 46c0a8473a5c2db85d2cac5b7a9e0421e18f9097 Mon Sep 17 00:00:00 2001 From: junkmd Date: Sat, 22 Feb 2025 19:57:31 +0900 Subject: [PATCH 3/7] Replace `comtypes.COMObject` and `comtypes.IUnknown` with specific imports in `server/localserver.py`. --- comtypes/server/localserver.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/comtypes/server/localserver.py b/comtypes/server/localserver.py index 27232ec8..b9ef243e 100644 --- a/comtypes/server/localserver.py +++ b/comtypes/server/localserver.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, Literal, Optional, Sequence, Type import comtypes -from comtypes import GUID, hresult +from comtypes import GUID, COMObject, IUnknown, hresult from comtypes.server import IClassFactory if TYPE_CHECKING: @@ -33,18 +33,18 @@ _CoRevokeClassObject.restype = HRESULT -def run(classes: Sequence[Type[comtypes.COMObject]]) -> None: +def run(classes: Sequence[Type[COMObject]]) -> None: classobjects = [ClassFactory(cls) for cls in classes] - comtypes.COMObject.__run_localserver__(classobjects) + COMObject.__run_localserver__(classobjects) -class ClassFactory(comtypes.COMObject): +class ClassFactory(COMObject): _com_interfaces_ = [IClassFactory] _locks: int = 0 _queue: Optional[queue.Queue] = None regcls: int = REGCLS_MULTIPLEUSE - def __init__(self, cls: Type[comtypes.COMObject], *args, **kw) -> None: + def __init__(self, cls: Type[COMObject], *args, **kw) -> None: super(ClassFactory, self).__init__() self._cls = cls self._register_class() @@ -60,11 +60,11 @@ def IUnknown_Release(self, this: Any) -> int: def _register_class(self) -> None: regcls = getattr(self._cls, "_regcls_", self.regcls) cookie = c_ulong() - ptr = self._com_pointers_[comtypes.IUnknown._iid_] + ptr = self._com_pointers_[IUnknown._iid_] clsctx = self._cls._reg_clsctx_ clsctx &= ~comtypes.CLSCTX_INPROC # reset the inproc flags _CoRegisterClassObject( - byref(comtypes.GUID(self._cls._reg_clsid_)), + byref(GUID(self._cls._reg_clsid_)), ptr, clsctx, regcls, @@ -78,8 +78,8 @@ def _revoke_class(self) -> None: def CreateInstance( self, this: Any, - punkOuter: Optional[Type["_Pointer[comtypes.IUnknown]"]], - riid: "_Pointer[comtypes.GUID]", + punkOuter: Optional[Type["_Pointer[IUnknown]"]], + riid: "_Pointer[GUID]", ppv: c_void_p, ) -> int: _debug("ClassFactory.CreateInstance(%s)", riid[0]) @@ -90,7 +90,7 @@ def CreateInstance( def LockServer(self, this: Any, fLock: bool) -> Literal[0]: if fLock: - comtypes.COMObject.__server__.Lock() + COMObject.__server__.Lock() else: - comtypes.COMObject.__server__.Unlock() + COMObject.__server__.Unlock() return hresult.S_OK From ce6edc2c887ea6bdad854a4a0a63a571620299df Mon Sep 17 00:00:00 2001 From: junkmd Date: Sat, 22 Feb 2025 19:57:31 +0900 Subject: [PATCH 4/7] Replace `import ctypes` with specific imports in `server/inprocserver.py`. --- comtypes/server/inprocserver.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/comtypes/server/inprocserver.py b/comtypes/server/inprocserver.py index 0998357f..7e4edc71 100644 --- a/comtypes/server/inprocserver.py +++ b/comtypes/server/inprocserver.py @@ -1,7 +1,7 @@ -import ctypes import logging import sys import winreg +from ctypes import c_void_p, pointer from typing import TYPE_CHECKING, Any, Literal, Optional, Type from comtypes import GUID, COMObject, IUnknown, hresult @@ -29,7 +29,7 @@ def IClassFactory_CreateInstance( this: Any, punkOuter: Optional[Type["_Pointer[IUnknown]"]], riid: "_Pointer[GUID]", - ppv: ctypes.c_void_p, + ppv: c_void_p, ) -> int: _debug("ClassFactory.CreateInstance(%s)", riid[0]) result = self._cls().IUnknown_QueryInterface(None, riid, ppv) @@ -138,7 +138,7 @@ def DllGetClassObject(rclsid: int, riid: int, ppv: int) -> int: return hresult.CLASS_E_CLASSNOTAVAILABLE result = ClassFactory(cls).IUnknown_QueryInterface( - None, ctypes.pointer(iid), ctypes.c_void_p(ppv) + None, pointer(iid), c_void_p(ppv) ) _debug("DllGetClassObject() -> %s", result) return result From cb4ee5a322d21b1b54e9fd31d2c90da6307768dd Mon Sep 17 00:00:00 2001 From: junkmd Date: Sat, 22 Feb 2025 19:57:31 +0900 Subject: [PATCH 5/7] Remove assignment to unused variable `res` from `PumpEvents`. --- comtypes/client/_events.py | 2 +- pyproject.toml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/comtypes/client/_events.py b/comtypes/client/_events.py index 958eaaf1..9bc23ced 100644 --- a/comtypes/client/_events.py +++ b/comtypes/client/_events.py @@ -359,7 +359,7 @@ def HandlerRoutine(dwCtrlType): try: try: - res = _CoWaitForMultipleHandles( + _CoWaitForMultipleHandles( 0, int(timeout * 1000), len(handles), diff --git a/pyproject.toml b/pyproject.toml index 9a565364..a87b3bb5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,6 @@ ignore = ["E402"] "comtypes/util.py" = ["F403", "F405"] "comtypes/viewobject.py" = ["F403", "F405"] "comtypes/client/_constants.py" = ["F401"] -"comtypes/client/_events.py" = ["F841"] "comtypes/server/automation.py" = ["F403", "F405"] "comtypes/server/connectionpoints.py" = ["F401", "F403", "F405"] "comtypes/server/inprocserver.py" = ["E713", "E722", "F841"] From 4236c06d277c18cfcd46d1949bbcef3f0a13204d Mon Sep 17 00:00:00 2001 From: junkmd Date: Sat, 22 Feb 2025 19:57:31 +0900 Subject: [PATCH 6/7] Convert to `not in` from `not ... in` in `inproc_find_class`. --- comtypes/server/inprocserver.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/comtypes/server/inprocserver.py b/comtypes/server/inprocserver.py index 7e4edc71..b2206ac9 100644 --- a/comtypes/server/inprocserver.py +++ b/comtypes/server/inprocserver.py @@ -58,7 +58,7 @@ def inproc_find_class(clsid: GUID) -> Type[COMObject]: except: _debug("NO path to insert") else: - if not pathdir in sys.path: + if pathdir not in sys.path: sys.path.insert(0, str(pathdir)) _debug("insert path %r", pathdir) else: diff --git a/pyproject.toml b/pyproject.toml index a87b3bb5..ac74bdcd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ ignore = ["E402"] "comtypes/client/_constants.py" = ["F401"] "comtypes/server/automation.py" = ["F403", "F405"] "comtypes/server/connectionpoints.py" = ["F401", "F403", "F405"] -"comtypes/server/inprocserver.py" = ["E713", "E722", "F841"] +"comtypes/server/inprocserver.py" = ["E722", "F841"] "comtypes/server/register.py" = ["E713"] "comtypes/tools/codegenerator/packing.py" = ["F821", "F841"] "comtypes/tools/typedesc.py" = ["F403", "F405"] From e85d2a7d9dcc623c98056e5d23fbe13bdaa4a40c Mon Sep 17 00:00:00 2001 From: junkmd Date: Sat, 22 Feb 2025 19:57:31 +0900 Subject: [PATCH 7/7] Add type assertions. --- comtypes/server/inprocserver.py | 1 + comtypes/server/localserver.py | 1 + 2 files changed, 2 insertions(+) diff --git a/comtypes/server/inprocserver.py b/comtypes/server/inprocserver.py index b2206ac9..a21164f7 100644 --- a/comtypes/server/inprocserver.py +++ b/comtypes/server/inprocserver.py @@ -37,6 +37,7 @@ def IClassFactory_CreateInstance( return result def IClassFactory_LockServer(self, this: Any, fLock: bool) -> Literal[0]: + assert COMObject.__server__ is not None, "The inprocserver is not running yet" if fLock: COMObject.__server__.Lock() else: diff --git a/comtypes/server/localserver.py b/comtypes/server/localserver.py index b9ef243e..9c9c406c 100644 --- a/comtypes/server/localserver.py +++ b/comtypes/server/localserver.py @@ -89,6 +89,7 @@ def CreateInstance( return result def LockServer(self, this: Any, fLock: bool) -> Literal[0]: + assert COMObject.__server__ is not None, "The localserver is not running yet" if fLock: COMObject.__server__.Lock() else: