Python Windows service



我正在使用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_MAIN_FUNCTIONW回调定义为:

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

最新更新