gpt4 book ai didi

python - 从 Python 3 调用 Windows API 时句柄无效

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:21 34 4
gpt4 key购买 nike

以下代码在 Python 2 中运行良好:

import ctypes

def test():
OpenSCManager = ctypes.windll.advapi32.OpenSCManagerA
CloseServiceHandle = ctypes.windll.advapi32.CloseServiceHandle

handle = OpenSCManager(None, None, 0)
print(hex(handle))
assert handle, ctypes.GetLastError()
assert CloseServiceHandle(handle), ctypes.GetLastError()

test()

它在 Python 3 中不起作用:

0x40d88f90
Traceback (most recent call last):
File ".\test1.py", line 12, in <module>
test()
File ".\test1.py", line 10, in test
assert CloseServiceHandle(handle), ctypes.GetLastError()
AssertionError: 6

6 表示句柄无效。

另外,Python 2 中检索到的句柄似乎是更小的数字,比如 0x100ffc0。它不是 CloseServiceHandle 的特定内容。此句柄不能与任何服务功能一起使用。

两个 Python 版本都是 64 位原生 Windows Python。

最佳答案

您应该使用 argtypesrestype 否则所有参数默认为 int 并在 64 位中被截断。此外,您不应直接调用 GetLastError,而应使用 ctypes.get_last_error() 来缓存最后的错误代码(在您执行打电话,你不能确定)。

这是一个工作示例:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import ctypes


def test():
advapi32 = ctypes.WinDLL("advapi32", use_last_error=True)
OpenSCManager = advapi32.OpenSCManagerA
OpenSCManager.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_ulong]
OpenSCManager.restype = ctypes.c_void_p

CloseServiceHandle = advapi32.CloseServiceHandle
CloseServiceHandle.argtypes = [ctypes.c_void_p]
CloseServiceHandle.restype = ctypes.c_long

handle = OpenSCManager(None, None, 0)
if not handle:
raise ctypes.WinError(ctypes.get_last_error())
print(f"handle: {handle:#x}")

result = CloseServiceHandle(handle)
if result == 0:
raise ctypes.WinError(ctypes.get_last_error())

def main():
test()


if __name__ == "__main__":
sys.exit(main())

关于python - 从 Python 3 调用 Windows API 时句柄无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55210371/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com