From 4f562a977a9f01590bf81c138fabec55dfaab6b0 Mon Sep 17 00:00:00 2001 From: junkmd Date: Sun, 14 Jun 2026 19:19:19 +0900 Subject: [PATCH 1/5] feat: Enhance `CoGetObject` overloads with `Literal` for improved type hinting. --- comtypes/client/_create.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/comtypes/client/_create.py b/comtypes/client/_create.py index 8ac9fc18..cb93c386 100644 --- a/comtypes/client/_create.py +++ b/comtypes/client/_create.py @@ -1,5 +1,5 @@ import logging -from typing import TYPE_CHECKING, Any, Optional, TypeVar, overload +from typing import TYPE_CHECKING, Any, Literal, Optional, TypeVar, overload from typing import Union as _UnionT import comtypes @@ -122,12 +122,26 @@ def CreateObject( return _manage(obj, clsid, interface=interface) -@overload -def CoGetObject(displayname: str, interface: type[_T_IUnknown]) -> _T_IUnknown: ... @overload def CoGetObject( - displayname: str, interface: None = None, dynamic: bool = False + displayname: str, + interface: None = None, + dynamic: Literal[False] = False, ) -> Any: ... +@overload +def CoGetObject( + displayname: str, + interface: None = None, + dynamic: Literal[True] = True, +) -> _UnionT[ + "comtypes.client.lazybind.Dispatch", "comtypes.client.dynamic._Dispatch" +]: ... +@overload +def CoGetObject( + displayname: str, + interface: type[_T_IUnknown], + dynamic: Literal[False] = False, +) -> _T_IUnknown: ... def CoGetObject( displayname: str, interface: Optional[type[IUnknown]] = None, From 803a9cf38286119b71fdbfa19f8f5cf5850febaf Mon Sep 17 00:00:00 2001 From: junkmd Date: Sun, 14 Jun 2026 19:19:19 +0900 Subject: [PATCH 2/5] feat: Enhance `CreateObject` overloads with `Literal` for improved type hinting. --- comtypes/client/_create.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/comtypes/client/_create.py b/comtypes/client/_create.py index cb93c386..326dcf91 100644 --- a/comtypes/client/_create.py +++ b/comtypes/client/_create.py @@ -56,8 +56,28 @@ def CreateObject( progid: _UnionT[str, type[CoClass], GUID], clsctx: Optional[int] = None, machine: Optional[str] = None, - interface: Optional[type[_T_IUnknown]] = None, - dynamic: bool = ..., + interface: None = None, + dynamic: Literal[False] = False, + pServerInfo: Optional[COSERVERINFO] = None, +) -> Any: ... +@overload +def CreateObject( + progid: _UnionT[str, type[CoClass], GUID], + clsctx: Optional[int] = None, + machine: Optional[str] = None, + interface: None = None, + dynamic: Literal[True] = True, + pServerInfo: Optional[COSERVERINFO] = None, +) -> _UnionT[ + "comtypes.client.lazybind.Dispatch", "comtypes.client.dynamic._Dispatch" +]: ... +@overload +def CreateObject( + progid: _UnionT[str, type[CoClass], GUID], + clsctx: Optional[int] = None, + machine: Optional[str] = None, + interface: type[_T_IUnknown] = IUnknown, + dynamic: Literal[False] = False, pServerInfo: Optional[COSERVERINFO] = None, ) -> _T_IUnknown: ... def CreateObject( From 587b17cfd1f59bcbf461ba752335420078567cfa Mon Sep 17 00:00:00 2001 From: junkmd Date: Sun, 14 Jun 2026 19:19:19 +0900 Subject: [PATCH 3/5] feat: Enhance `GetActiveObject` overloads with `Literal` for improved type hinting. --- comtypes/client/_activeobj.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/comtypes/client/_activeobj.py b/comtypes/client/_activeobj.py index d70f7bc9..7130f0e5 100644 --- a/comtypes/client/_activeobj.py +++ b/comtypes/client/_activeobj.py @@ -1,4 +1,4 @@ -from typing import Any, Optional, TypeVar, overload +from typing import Any, Literal, Optional, TypeVar, overload from typing import Union as _UnionT import comtypes @@ -14,10 +14,24 @@ # Object creation # @overload -def GetActiveObject(progid: _UnionT[str, type[CoClass], GUID]) -> Any: ... +def GetActiveObject( + progid: _UnionT[str, type[CoClass], GUID], + interface: None = None, + dynamic: Literal[False] = False, +) -> Any: ... +@overload +def GetActiveObject( + progid: _UnionT[str, type[CoClass], GUID], + interface: None = None, + dynamic: Literal[True] = True, +) -> _UnionT[ + "comtypes.client.lazybind.Dispatch", "comtypes.client.dynamic._Dispatch" +]: ... @overload def GetActiveObject( - progid: _UnionT[str, type[CoClass], GUID], interface: type[_T_IUnknown] + progid: _UnionT[str, type[CoClass], GUID], + interface: type[_T_IUnknown] = IUnknown, + dynamic: Literal[False] = False, ) -> _T_IUnknown: ... def GetActiveObject( progid: _UnionT[str, type[CoClass], GUID], From 87fb98209dec7d58d222f0269524c7ec56074805 Mon Sep 17 00:00:00 2001 From: junkmd Date: Sun, 14 Jun 2026 19:19:19 +0900 Subject: [PATCH 4/5] feat: Refine `pServerInfo` type hint in `GetClassObject` and `CreateObject`. --- comtypes/client/_create.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/comtypes/client/_create.py b/comtypes/client/_create.py index 326dcf91..39ff2406 100644 --- a/comtypes/client/_create.py +++ b/comtypes/client/_create.py @@ -8,6 +8,8 @@ from comtypes.client._managing import _manage if TYPE_CHECKING: + from ctypes import _CArgObject + from comtypes import hints # type: ignore @@ -23,20 +25,20 @@ def GetClassObject( progid: _UnionT[str, type[CoClass], GUID], clsctx: Optional[int] = None, - pServerInfo: Optional[COSERVERINFO] = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, interface: None = None, ) -> "hints.IClassFactory": ... @overload def GetClassObject( progid: _UnionT[str, type[CoClass], GUID], clsctx: Optional[int] = None, - pServerInfo: Optional[COSERVERINFO] = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, interface: type[_T_IUnknown] = IUnknown, ) -> _T_IUnknown: ... def GetClassObject( progid: _UnionT[str, type[CoClass], GUID], clsctx: Optional[int] = None, - pServerInfo: Optional[COSERVERINFO] = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, interface: Optional[type[IUnknown]] = None, ) -> IUnknown: """Create and return the class factory for a COM object. @@ -58,7 +60,7 @@ def CreateObject( machine: Optional[str] = None, interface: None = None, dynamic: Literal[False] = False, - pServerInfo: Optional[COSERVERINFO] = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, ) -> Any: ... @overload def CreateObject( @@ -67,7 +69,7 @@ def CreateObject( machine: Optional[str] = None, interface: None = None, dynamic: Literal[True] = True, - pServerInfo: Optional[COSERVERINFO] = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, ) -> _UnionT[ "comtypes.client.lazybind.Dispatch", "comtypes.client.dynamic._Dispatch" ]: ... @@ -78,7 +80,7 @@ def CreateObject( machine: Optional[str] = None, interface: type[_T_IUnknown] = IUnknown, dynamic: Literal[False] = False, - pServerInfo: Optional[COSERVERINFO] = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, ) -> _T_IUnknown: ... def CreateObject( progid: _UnionT[str, type[CoClass], GUID], # which object to create @@ -86,7 +88,7 @@ def CreateObject( machine: Optional[str] = None, # where to create the object interface: Optional[type[IUnknown]] = None, # the interface we want dynamic: bool = False, # use dynamic dispatch - pServerInfo: Optional[COSERVERINFO] = None, # server info struct for remoting + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, # server info struct for remoting ) -> Any: """Create a COM object from 'progid', and try to QueryInterface() it to the most useful interface, generating typelib support on From 97fb345b34ffe534347c8fc3a222dba083e27a07 Mon Sep 17 00:00:00 2001 From: junkmd Date: Sun, 14 Jun 2026 19:19:19 +0900 Subject: [PATCH 5/5] feat: Refine `pServerInfo` type hint in `CoGetClassObject` and `CoCreateInstanceEx`. --- comtypes/_post_coinit/misc.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/comtypes/_post_coinit/misc.py b/comtypes/_post_coinit/misc.py index e2c92108..7910389b 100644 --- a/comtypes/_post_coinit/misc.py +++ b/comtypes/_post_coinit/misc.py @@ -14,6 +14,7 @@ ) from ctypes.wintypes import DWORD, LPCWSTR, LPVOID from typing import TYPE_CHECKING, Any, Optional, TypeVar, overload +from typing import Union as _UnionT from comtypes import CLSCTX_LOCAL_SERVER, CLSCTX_REMOTE_SERVER, CLSCTX_SERVER, GUID from comtypes._memberspec import COMMETHOD @@ -21,7 +22,7 @@ from comtypes.GUID import REFCLSID if TYPE_CHECKING: - from ctypes import _Pointer + from ctypes import _CArgObject, _Pointer from comtypes import hints as hints # noqa # type: ignore @@ -146,20 +147,20 @@ def CoCreateInstance( def CoGetClassObject( clsid: GUID, clsctx: Optional[int] = None, - pServerInfo: "Optional[COSERVERINFO]" = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, interface: None = None, ) -> "hints.IClassFactory": ... @overload def CoGetClassObject( clsid: GUID, clsctx: Optional[int] = None, - pServerInfo: "Optional[COSERVERINFO]" = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, interface: type[_T_IUnknown] = IUnknown, ) -> _T_IUnknown: ... def CoGetClassObject( clsid: GUID, clsctx: Optional[int] = None, - pServerInfo: "Optional[COSERVERINFO]" = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, interface: Optional[type[IUnknown]] = None, ) -> IUnknown: if clsctx is None: @@ -337,7 +338,7 @@ def CoCreateInstanceEx( interface: None = None, clsctx: Optional[int] = None, machine: Optional[str] = None, - pServerInfo: Optional[COSERVERINFO] = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, ) -> IUnknown: ... @overload def CoCreateInstanceEx( @@ -345,14 +346,14 @@ def CoCreateInstanceEx( interface: type[_T_IUnknown], clsctx: Optional[int] = None, machine: Optional[str] = None, - pServerInfo: Optional[COSERVERINFO] = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, ) -> _T_IUnknown: ... def CoCreateInstanceEx( clsid: GUID, interface: Optional[type[IUnknown]] = None, clsctx: Optional[int] = None, machine: Optional[str] = None, - pServerInfo: Optional[COSERVERINFO] = None, + pServerInfo: "_UnionT[None, _CArgObject, COSERVERINFO]" = None, ) -> IUnknown: """The basic windows api to create a COM class object and return a pointer to an interface, possibly on another machine.