Python 3.x Python Windows服务
我正在使用Windows API构建一个服务。我已经测试并使用了win32serviceutil.ServiceFramework模块,但我正在尝试使用第三方导入 到目前为止,我有以下几点: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
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)
引发异常。