From 32c194b05c225ffe3224b58b174645c8bda15848 Mon Sep 17 00:00:00 2001 From: qwertycxz Date: Thu, 24 Jul 2025 23:39:31 +0800 Subject: [PATCH 1/7] Add missing win32com packages --- stubs/pywin32/win32com/server/factory.pyi | 9 +++ stubs/pywin32/win32com/server/localserver.pyi | 15 ++++ stubs/pywin32/win32com/server/register.pyi | 68 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 stubs/pywin32/win32com/server/factory.pyi create mode 100644 stubs/pywin32/win32com/server/localserver.pyi create mode 100644 stubs/pywin32/win32com/server/register.pyi diff --git a/stubs/pywin32/win32com/server/factory.pyi b/stubs/pywin32/win32com/server/factory.pyi new file mode 100644 index 000000000000..f651384b32e3 --- /dev/null +++ b/stubs/pywin32/win32com/server/factory.pyi @@ -0,0 +1,9 @@ +from collections.abc import Iterable +from typing import Any + +from _win32typing import PyIClassFactory, PyIID + +def RegisterClassFactories( + clsids: Iterable[PyIID], flags: int | None = None, clsctx: int | None = None +) -> list[tuple[PyIClassFactory, Any]]: ... +def RevokeClassFactories(infos: Iterable[tuple[Any, Any]]) -> None: ... diff --git a/stubs/pywin32/win32com/server/localserver.pyi b/stubs/pywin32/win32com/server/localserver.pyi new file mode 100644 index 000000000000..a03fd6b64441 --- /dev/null +++ b/stubs/pywin32/win32com/server/localserver.pyi @@ -0,0 +1,15 @@ +from collections.abc import Iterable + +from _win32typing import PyIID + +usage = """Invalid command line arguments + +This program provides LocalServer COM support +for Python COM objects. + +It is typically run automatically by COM, passing as arguments +The ProgID or CLSID of the Python Server(s) to be hosted +""" + +def serve(clsids: Iterable[PyIID]) -> None: ... +def main() -> None: ... diff --git a/stubs/pywin32/win32com/server/register.pyi b/stubs/pywin32/win32com/server/register.pyi new file mode 100644 index 000000000000..5aefbf270670 --- /dev/null +++ b/stubs/pywin32/win32com/server/register.pyi @@ -0,0 +1,68 @@ +from collections.abc import Callable, Mapping +from typing import Literal, Protocol, TypedDict, TypeVar, Unpack + +from _win32typing import PyHKEY, PyIID, PyIUnknown +from win32con import HKEY_CLASSES_ROOT + +T = TypeVar("T", PyHKEY, int) + +class RegisterClass(Protocol): + _reg_clsid_: PyIID + +class RegisterFlag(TypedDict, total=False): + quiet: bool + debug: bool + finalize_register: Callable[[], None] + +class UnregisterFlag(TypedDict, total=False): + quiet: bool + finalize_unregister: Callable[[], None] + +class ElevatedFlag(TypedDict, total=False): + quiet: bool + unattended: bool + hwnd: int + +class CommandFlag(RegisterFlag, UnregisterFlag, ElevatedFlag): # type: ignore[misc] + ... + +CATID_PythonCOMServer = "{B3EF80D0-68E2-11D0-A689-00C04FD658FF}" + +def _set_subkeys(keyName: str, valueDict: Mapping[str | None, str], base: PyHKEY | int = HKEY_CLASSES_ROOT) -> None: ... +def _set_string(path: str | None, value: str, base: PyHKEY | int = HKEY_CLASSES_ROOT) -> None: ... +def _get_string(path: str | None, base: PyHKEY | int = HKEY_CLASSES_ROOT) -> str | None: ... +def _remove_key(path: str | None, base: PyHKEY | int = HKEY_CLASSES_ROOT) -> None: ... +def recurse_delete_key(path: str | None, base: PyHKEY | int = HKEY_CLASSES_ROOT) -> None: ... +def _cat_registrar() -> PyIUnknown: ... +def _find_localserver_exe(mustfind: bool) -> str | None: ... +def _find_localserver_module() -> str: ... +def RegisterServer( + clsid: PyIID, + pythonInstString: str | None = None, + desc: str | None = None, + progID: str | None = None, + verProgID: str | None = None, + defIcon: str | None = None, + threadingModel: Literal["apartment", "both", "free", "neutral"] = "both", + policy: str | None = None, + catids: list[PyIID] = [], + other: Mapping[str, str] = {}, + addPyComCat: bool | None = None, + dispatcher: str | None = None, + clsctx: int | None = None, + addnPath: str | None = None, +) -> None: ... +def GetUnregisterServerKeys( + clsid: PyIID, progID: str | None = None, verProgID: str | None = None, customKeys: tuple[str, T] | None = None +) -> list[tuple[str, T | int]]: ... +def UnregisterServer( + clsid: PyIID, progID: str | None = None, verProgID: str | None = None, customKeys: tuple[str, PyHKEY | int] | None = None +) -> None: ... +def GetRegisteredServerOption(clsid: PyIID, optionName: str) -> str | None: ... +def _get(ob: object, attr: str, default=None): ... +def RegisterClasses(*classes: type[RegisterClass], **flags: Unpack[RegisterFlag]) -> None: ... +def UnregisterClasses(*classes: type[RegisterClass], **flags: Unpack[UnregisterFlag]) -> None: ... +def UnregisterInfoClasses(*classes: type[RegisterClass]) -> list[tuple[str, PyHKEY | int]]: ... +def ReExecuteElevated(flags: ElevatedFlag) -> None: ... +def UseCommandLine(*classes: type[RegisterClass], **flags: Unpack[CommandFlag]) -> list[tuple[str, PyHKEY | int]] | None: ... +def RegisterPyComCategory() -> None: ... From a4ffe5e858a714199be28918a498b51dce78bf0b Mon Sep 17 00:00:00 2001 From: qwertycxz Date: Tue, 29 Jul 2025 17:54:04 +0800 Subject: [PATCH 2/7] Use `from typing_extensions import Unpack` instead --- stubs/pywin32/win32com/server/register.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stubs/pywin32/win32com/server/register.pyi b/stubs/pywin32/win32com/server/register.pyi index 5aefbf270670..ada512acff6c 100644 --- a/stubs/pywin32/win32com/server/register.pyi +++ b/stubs/pywin32/win32com/server/register.pyi @@ -1,5 +1,6 @@ from collections.abc import Callable, Mapping -from typing import Literal, Protocol, TypedDict, TypeVar, Unpack +from typing import Literal, Protocol, TypedDict, TypeVar +from typing_extensions import Unpack from _win32typing import PyHKEY, PyIID, PyIUnknown from win32con import HKEY_CLASSES_ROOT From 5f6c00806e310e70c93f08dc83656344d1d66fd3 Mon Sep 17 00:00:00 2001 From: qwertycxz Date: Tue, 29 Jul 2025 19:02:45 +0800 Subject: [PATCH 3/7] Fix stub style --- .../@tests/stubtest_allowlist_win32.txt | 5 --- stubs/pywin32/win32com/server/localserver.pyi | 9 +---- stubs/pywin32/win32com/server/register.pyi | 39 +++++++++---------- 3 files changed, 20 insertions(+), 33 deletions(-) diff --git a/stubs/pywin32/@tests/stubtest_allowlist_win32.txt b/stubs/pywin32/@tests/stubtest_allowlist_win32.txt index c2329ad6412d..99ec66422bc0 100644 --- a/stubs/pywin32/@tests/stubtest_allowlist_win32.txt +++ b/stubs/pywin32/@tests/stubtest_allowlist_win32.txt @@ -21,11 +21,6 @@ win32com.client.util win32com.makegw.* (win32.lib.)?pywintypes.__import_pywin32_system_module__ -# COM object servers scripts -win32com.server.factory -win32com.server.localserver -win32com.server.register -win32com.servers.* # Active X Scripts win32com(ext)?.axscript.client.pyscript_rexec win32com(ext)?.axscript.client.pyscript diff --git a/stubs/pywin32/win32com/server/localserver.pyi b/stubs/pywin32/win32com/server/localserver.pyi index a03fd6b64441..c60f7da5f8db 100644 --- a/stubs/pywin32/win32com/server/localserver.pyi +++ b/stubs/pywin32/win32com/server/localserver.pyi @@ -2,14 +2,7 @@ from collections.abc import Iterable from _win32typing import PyIID -usage = """Invalid command line arguments - -This program provides LocalServer COM support -for Python COM objects. - -It is typically run automatically by COM, passing as arguments -The ProgID or CLSID of the Python Server(s) to be hosted -""" +usage: str def serve(clsids: Iterable[PyIID]) -> None: ... def main() -> None: ... diff --git a/stubs/pywin32/win32com/server/register.pyi b/stubs/pywin32/win32com/server/register.pyi index ada512acff6c..9e610879522d 100644 --- a/stubs/pywin32/win32com/server/register.pyi +++ b/stubs/pywin32/win32com/server/register.pyi @@ -3,37 +3,36 @@ from typing import Literal, Protocol, TypedDict, TypeVar from typing_extensions import Unpack from _win32typing import PyHKEY, PyIID, PyIUnknown -from win32con import HKEY_CLASSES_ROOT -T = TypeVar("T", PyHKEY, int) +_T = TypeVar("_T", PyHKEY, int) -class RegisterClass(Protocol): +class _RegisterClass(Protocol): _reg_clsid_: PyIID -class RegisterFlag(TypedDict, total=False): +class _RegisterFlag(TypedDict, total=False): quiet: bool debug: bool finalize_register: Callable[[], None] -class UnregisterFlag(TypedDict, total=False): +class _UnregisterFlag(TypedDict, total=False): quiet: bool finalize_unregister: Callable[[], None] -class ElevatedFlag(TypedDict, total=False): +class _ElevatedFlag(TypedDict, total=False): quiet: bool unattended: bool hwnd: int -class CommandFlag(RegisterFlag, UnregisterFlag, ElevatedFlag): # type: ignore[misc] +class _CommandFlag(_RegisterFlag, _UnregisterFlag, _ElevatedFlag): # type: ignore[misc] ... -CATID_PythonCOMServer = "{B3EF80D0-68E2-11D0-A689-00C04FD658FF}" +CATID_PythonCOMServer: Literal["{B3EF80D0-68E2-11D0-A689-00C04FD658FF}"] -def _set_subkeys(keyName: str, valueDict: Mapping[str | None, str], base: PyHKEY | int = HKEY_CLASSES_ROOT) -> None: ... -def _set_string(path: str | None, value: str, base: PyHKEY | int = HKEY_CLASSES_ROOT) -> None: ... -def _get_string(path: str | None, base: PyHKEY | int = HKEY_CLASSES_ROOT) -> str | None: ... -def _remove_key(path: str | None, base: PyHKEY | int = HKEY_CLASSES_ROOT) -> None: ... -def recurse_delete_key(path: str | None, base: PyHKEY | int = HKEY_CLASSES_ROOT) -> None: ... +def _set_subkeys(keyName: str, valueDict: Mapping[str | None, str], base: PyHKEY | int = ...) -> None: ... +def _set_string(path: str | None, value: str, base: PyHKEY | int = ...) -> None: ... +def _get_string(path: str | None, base: PyHKEY | int = ...) -> str | None: ... +def _remove_key(path: str | None, base: PyHKEY | int = ...) -> None: ... +def recurse_delete_key(path: str | None, base: PyHKEY | int = ...) -> None: ... def _cat_registrar() -> PyIUnknown: ... def _find_localserver_exe(mustfind: bool) -> str | None: ... def _find_localserver_module() -> str: ... @@ -54,16 +53,16 @@ def RegisterServer( addnPath: str | None = None, ) -> None: ... def GetUnregisterServerKeys( - clsid: PyIID, progID: str | None = None, verProgID: str | None = None, customKeys: tuple[str, T] | None = None -) -> list[tuple[str, T | int]]: ... + clsid: PyIID, progID: str | None = None, verProgID: str | None = None, customKeys: tuple[str, _T] | None = None +) -> list[tuple[str, _T | int]]: ... def UnregisterServer( clsid: PyIID, progID: str | None = None, verProgID: str | None = None, customKeys: tuple[str, PyHKEY | int] | None = None ) -> None: ... def GetRegisteredServerOption(clsid: PyIID, optionName: str) -> str | None: ... def _get(ob: object, attr: str, default=None): ... -def RegisterClasses(*classes: type[RegisterClass], **flags: Unpack[RegisterFlag]) -> None: ... -def UnregisterClasses(*classes: type[RegisterClass], **flags: Unpack[UnregisterFlag]) -> None: ... -def UnregisterInfoClasses(*classes: type[RegisterClass]) -> list[tuple[str, PyHKEY | int]]: ... -def ReExecuteElevated(flags: ElevatedFlag) -> None: ... -def UseCommandLine(*classes: type[RegisterClass], **flags: Unpack[CommandFlag]) -> list[tuple[str, PyHKEY | int]] | None: ... +def RegisterClasses(*classes: type[_RegisterClass], **flags: Unpack[_RegisterFlag]) -> None: ... +def UnregisterClasses(*classes: type[_RegisterClass], **flags: Unpack[_UnregisterFlag]) -> None: ... +def UnregisterInfoClasses(*classes: type[_RegisterClass]) -> list[tuple[str, PyHKEY | int]]: ... +def ReExecuteElevated(flags: _ElevatedFlag) -> None: ... +def UseCommandLine(*classes: type[_RegisterClass], **flags: Unpack[_CommandFlag]) -> list[tuple[str, PyHKEY | int]] | None: ... def RegisterPyComCategory() -> None: ... From 80a9ca197ff67d1c18cd8e2cd06c88c46a263321 Mon Sep 17 00:00:00 2001 From: qwertycxz Date: Tue, 29 Jul 2025 19:07:53 +0800 Subject: [PATCH 4/7] fix allow list --- stubs/pywin32/@tests/stubtest_allowlist_win32.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stubs/pywin32/@tests/stubtest_allowlist_win32.txt b/stubs/pywin32/@tests/stubtest_allowlist_win32.txt index 99ec66422bc0..37ea55f8e223 100644 --- a/stubs/pywin32/@tests/stubtest_allowlist_win32.txt +++ b/stubs/pywin32/@tests/stubtest_allowlist_win32.txt @@ -21,6 +21,8 @@ win32com.client.util win32com.makegw.* (win32.lib.)?pywintypes.__import_pywin32_system_module__ +# COM object servers scripts +win32com.servers.* # Active X Scripts win32com(ext)?.axscript.client.pyscript_rexec win32com(ext)?.axscript.client.pyscript From e9c036b23088bb6ed231942004b1cc0d222d926e Mon Sep 17 00:00:00 2001 From: qwertycxz Date: Tue, 29 Jul 2025 19:59:00 +0800 Subject: [PATCH 5/7] fix some stub error --- stubs/pywin32/pythoncom.pyi | 4 +-- stubs/pywin32/win32com/server/factory.pyi | 4 +-- stubs/pywin32/win32com/server/localserver.pyi | 3 +- stubs/pywin32/win32com/server/register.pyi | 28 +++++++++---------- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/stubs/pywin32/pythoncom.pyi b/stubs/pywin32/pythoncom.pyi index 0e0c3bc0147c..657a736f0c55 100644 --- a/stubs/pywin32/pythoncom.pyi +++ b/stubs/pywin32/pythoncom.pyi @@ -47,9 +47,9 @@ def CoUnmarshalInterface(Stm: _win32typing.PyIStream, riid: _win32typing.PyIID, def CoReleaseMarshalData(Stm: _win32typing.PyIStream, /) -> None: ... def CoGetObject(name: str, iid: _win32typing.PyIID, bindOpts: Incomplete | None = ..., /) -> _win32typing.PyIUnknown: ... def CoUninitialize() -> None: ... -def CoRegisterClassObject(iid: _win32typing.PyIID, factory: _win32typing.PyIUnknown, context, flags, /): ... +def CoRegisterClassObject(iid: _win32typing.PyIID, factory: _win32typing.PyIUnknown, context, flags, /) -> int: ... def CoResumeClassObjects() -> None: ... -def CoRevokeClassObject(reg, /) -> None: ... +def CoRevokeClassObject(reg: int, /) -> None: ... def CoTreatAsClass(clsidold: _win32typing.PyIID, clsidnew: _win32typing.PyIID, /) -> None: ... def CoWaitForMultipleHandles(Flags, Timeout, Handles: list[int], /): ... def Connect(cls, /) -> _win32typing.PyIDispatch: ... diff --git a/stubs/pywin32/win32com/server/factory.pyi b/stubs/pywin32/win32com/server/factory.pyi index f651384b32e3..4a002e6c0e11 100644 --- a/stubs/pywin32/win32com/server/factory.pyi +++ b/stubs/pywin32/win32com/server/factory.pyi @@ -5,5 +5,5 @@ from _win32typing import PyIClassFactory, PyIID def RegisterClassFactories( clsids: Iterable[PyIID], flags: int | None = None, clsctx: int | None = None -) -> list[tuple[PyIClassFactory, Any]]: ... -def RevokeClassFactories(infos: Iterable[tuple[Any, Any]]) -> None: ... +) -> list[tuple[PyIClassFactory, int]]: ... +def RevokeClassFactories(infos: Iterable[tuple[Any, int]]) -> None: ... # The first element is not used in the original code. diff --git a/stubs/pywin32/win32com/server/localserver.pyi b/stubs/pywin32/win32com/server/localserver.pyi index c60f7da5f8db..dd0f6c43efb0 100644 --- a/stubs/pywin32/win32com/server/localserver.pyi +++ b/stubs/pywin32/win32com/server/localserver.pyi @@ -1,8 +1,9 @@ from collections.abc import Iterable +from typing import Final from _win32typing import PyIID -usage: str +usage: Final[str] def serve(clsids: Iterable[PyIID]) -> None: ... def main() -> None: ... diff --git a/stubs/pywin32/win32com/server/register.pyi b/stubs/pywin32/win32com/server/register.pyi index 9e610879522d..0e7051fc9d05 100644 --- a/stubs/pywin32/win32com/server/register.pyi +++ b/stubs/pywin32/win32com/server/register.pyi @@ -1,41 +1,39 @@ -from collections.abc import Callable, Mapping -from typing import Literal, Protocol, TypedDict, TypeVar +from collections.abc import Callable, Iterable, Mapping +from typing import Literal, Protocol, TypedDict, TypeVar, type_check_only from typing_extensions import Unpack -from _win32typing import PyHKEY, PyIID, PyIUnknown +from _win32typing import PyHKEY, PyIID _T = TypeVar("_T", PyHKEY, int) +@type_check_only class _RegisterClass(Protocol): _reg_clsid_: PyIID +@type_check_only class _RegisterFlag(TypedDict, total=False): quiet: bool debug: bool finalize_register: Callable[[], None] +@type_check_only class _UnregisterFlag(TypedDict, total=False): quiet: bool finalize_unregister: Callable[[], None] +@type_check_only class _ElevatedFlag(TypedDict, total=False): quiet: bool unattended: bool hwnd: int +@type_check_only class _CommandFlag(_RegisterFlag, _UnregisterFlag, _ElevatedFlag): # type: ignore[misc] ... CATID_PythonCOMServer: Literal["{B3EF80D0-68E2-11D0-A689-00C04FD658FF}"] -def _set_subkeys(keyName: str, valueDict: Mapping[str | None, str], base: PyHKEY | int = ...) -> None: ... -def _set_string(path: str | None, value: str, base: PyHKEY | int = ...) -> None: ... -def _get_string(path: str | None, base: PyHKEY | int = ...) -> str | None: ... -def _remove_key(path: str | None, base: PyHKEY | int = ...) -> None: ... -def recurse_delete_key(path: str | None, base: PyHKEY | int = ...) -> None: ... -def _cat_registrar() -> PyIUnknown: ... -def _find_localserver_exe(mustfind: bool) -> str | None: ... -def _find_localserver_module() -> str: ... +def recurse_delete_key(path: str | None, base: PyHKEY | int = -2147483648) -> None: ... def RegisterServer( clsid: PyIID, pythonInstString: str | None = None, @@ -53,13 +51,15 @@ def RegisterServer( addnPath: str | None = None, ) -> None: ... def GetUnregisterServerKeys( - clsid: PyIID, progID: str | None = None, verProgID: str | None = None, customKeys: tuple[str, _T] | None = None + clsid: PyIID, progID: str | None = None, verProgID: str | None = None, customKeys: Iterable[tuple[str, _T]] | None = None ) -> list[tuple[str, _T | int]]: ... def UnregisterServer( - clsid: PyIID, progID: str | None = None, verProgID: str | None = None, customKeys: tuple[str, PyHKEY | int] | None = None + clsid: PyIID, + progID: str | None = None, + verProgID: str | None = None, + customKeys: Iterable[tuple[str, PyHKEY | int]] | None = None, ) -> None: ... def GetRegisteredServerOption(clsid: PyIID, optionName: str) -> str | None: ... -def _get(ob: object, attr: str, default=None): ... def RegisterClasses(*classes: type[_RegisterClass], **flags: Unpack[_RegisterFlag]) -> None: ... def UnregisterClasses(*classes: type[_RegisterClass], **flags: Unpack[_UnregisterFlag]) -> None: ... def UnregisterInfoClasses(*classes: type[_RegisterClass]) -> list[tuple[str, PyHKEY | int]]: ... From 4b911b9b251bb800485ea9b7c69b1f0c328d825a Mon Sep 17 00:00:00 2001 From: qwertycxz Date: Thu, 31 Jul 2025 00:13:09 +0800 Subject: [PATCH 6/7] Use `Unused` instead of `Any` --- stubs/pywin32/win32com/server/factory.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stubs/pywin32/win32com/server/factory.pyi b/stubs/pywin32/win32com/server/factory.pyi index 4a002e6c0e11..3de546181158 100644 --- a/stubs/pywin32/win32com/server/factory.pyi +++ b/stubs/pywin32/win32com/server/factory.pyi @@ -1,9 +1,9 @@ +from _typeshed import Unused from collections.abc import Iterable -from typing import Any from _win32typing import PyIClassFactory, PyIID def RegisterClassFactories( clsids: Iterable[PyIID], flags: int | None = None, clsctx: int | None = None ) -> list[tuple[PyIClassFactory, int]]: ... -def RevokeClassFactories(infos: Iterable[tuple[Any, int]]) -> None: ... # The first element is not used in the original code. +def RevokeClassFactories(infos: Iterable[tuple[Unused, int]]) -> None: ... From 1c3c4881da17f275a668b54391c9ce6a6ceefcc8 Mon Sep 17 00:00:00 2001 From: qwertycxz Date: Thu, 31 Jul 2025 00:16:07 +0800 Subject: [PATCH 7/7] Mark `PythonCOMServer` as const --- stubs/pywin32/win32com/server/register.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stubs/pywin32/win32com/server/register.pyi b/stubs/pywin32/win32com/server/register.pyi index 0e7051fc9d05..78fb2c6899fe 100644 --- a/stubs/pywin32/win32com/server/register.pyi +++ b/stubs/pywin32/win32com/server/register.pyi @@ -1,5 +1,5 @@ from collections.abc import Callable, Iterable, Mapping -from typing import Literal, Protocol, TypedDict, TypeVar, type_check_only +from typing import Final, Literal, Protocol, TypedDict, TypeVar, type_check_only from typing_extensions import Unpack from _win32typing import PyHKEY, PyIID @@ -31,7 +31,7 @@ class _ElevatedFlag(TypedDict, total=False): class _CommandFlag(_RegisterFlag, _UnregisterFlag, _ElevatedFlag): # type: ignore[misc] ... -CATID_PythonCOMServer: Literal["{B3EF80D0-68E2-11D0-A689-00C04FD658FF}"] +CATID_PythonCOMServer: Final = "{B3EF80D0-68E2-11D0-A689-00C04FD658FF}" def recurse_delete_key(path: str | None, base: PyHKEY | int = -2147483648) -> None: ... def RegisterServer( pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy