Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python Windows服务_Python 3.x_Windows_Ctypes - Fatal编程技术网

Python 3.x Python Windows服务

Python 3.x Python Windows服务,python-3.x,windows,ctypes,Python 3.x,Windows,Ctypes,我正在使用Windows API构建一个服务。我已经测试并使用了win32serviceutil.ServiceFramework模块,但我正在尝试使用第三方导入 到目前为止,我有以下几点: LPSERVICE_MAIN_FUNCTIONW = ctypes.WINFUNCTYPE(ctypes.c_ulong, ctypes.c_wchar_p) class SERVICE_TABLE_ENTRYW(ctypes.Structure): _fields_ = [('ServiceNa

我正在使用Windows API构建一个服务。我已经测试并使用了win32serviceutil.ServiceFramework模块,但我正在尝试使用第三方导入

到目前为止,我有以下几点:

LPSERVICE_MAIN_FUNCTIONW = ctypes.WINFUNCTYPE(ctypes.c_ulong, ctypes.c_wchar_p)

class SERVICE_TABLE_ENTRYW(ctypes.Structure):
    _fields_ = [('ServiceName', ctypes.c_wchar_p),
                ('ServiceProc', LPSERVICE_MAIN_FUNCTIONW)]

def test():
    logging.info('Test is running')

service_process = LPSERVICE_MAIN_FUNCTIONW(test)
service_table = SERVICE_TABLE_ENTRYW(ServiceName='Test_Service', ServiceProc=service_process)
ctypes.windll.advapi32.StartServiceCtrlDispatcherW(service_table)
但是,在调用StartServiceCtrlDispatcherW时,我返回了以下错误:

ValueError:调用过程的参数可能太多


如果有人能提供一些帮助或指导,我们将不胜感激。
LPSERVICE\u MAIN\u函数w
回调定义为:

typedef VOID (WINAPI *LPSERVICE_MAIN_FUNCTIONW)(
    DWORD   dwNumServicesArgs,
    LPWSTR  *lpServiceArgVectors
    );
即:

LPSERVICE_MAIN_FUNCTIONW = ctypes.WINFUNCTYPE(None, ctypes.c_ulong, ctypes.POINTER(ctypes.c_wchar_p))
或者如果使用
ctypes.wintypes

from ctypes import WINFUNCTYPE,POINTER
from ctypes import wintypes as w

LPSERVICE_MAIN_FUNCTIONW = WINFUNCTYPE(None, w.DWORD, POINTER(w.LPWSTR))

注意
WINFUNCTYPE
的第一个参数是返回类型,回调的第二个参数是
LPWSTR*
而不是
LPWSTR

此外,为了避免将来出现问题,OP应该停止使用共享的
ctypes.windell
库加载器,这可能会导致原型定义与其他包发生冲突,并且不会保留FFI调用前后线程的最后一个错误值。而是使用
advapi32=ctypes.windell('advapi32.dll',使用\u last\u error=True)
。当API调用因
ctypes失败时获取最后一个错误代码。获取\u last\u error()
,通常通过
raise ctypes.WinError(error\u code)
引发异常。