我正在使用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
。