我使用With Extended Service Notifications示例代码在python中为Windows XP +编写了一项服务.它非常适合检测用户登录/注销锁定屏幕和其他事件.问题是它永远不会执行关闭事件,并在重启/关闭时正常停止服务.它通过登录/注销事件保持活动状态,并在重新启动后再次启动.任何帮助,将不胜感激.
我不想使用RegisterServiceCtrlHandlerEx并处理控制台信号,如果我能帮助它 - 服务内置了这个功能,我只是以某种方式破坏了它.
这是代码:
from os.path import splitext, abspath
from sys import modules
import win32serviceutil
import win32service
import win32event
import win32api
import win32security
import win32ts
class Service(win32serviceutil.ServiceFramework):
_svc_name_ = '_unNamed'
_svc_display_name_ = '_Service Template'
def __init__(self, *args):
win32serviceutil.ServiceFramework.__init__(self, *args)
self.log('Initializing Service')
self.stop_event = win32event.CreateEvent(None, 0, 0, None)
self.server = None
def log(self, msg):
import servicemanager
servicemanager.LogInfoMsg(str(msg))
def logErr(self, msg):
import servicemanager
servicemanager.LogErrorMsg(str(msg))
def logWarn(self, msg):
import servicemanager
servicemanager.LogWarningMsg(str(msg))
def sleep(self, sec):
win32api.Sleep(sec*1000, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一个简单的C#命令行实用程序移植到Python.C#程序使用一个名为foobar.dll的自定义.Net dll,它通过I2C与一些实验室设备连接.C#代码中dll的用法如下:
fooBar.fooProvider provider = new foobar.fooProvider()
fooBar.fooBarLib fooLib = new foobar.fooBarLib(provider, 0x80)
# used below ...
numFloat = fooLib.GetSomething()
# more python ...
fooLib.SetSomething(NumberAsAFloat)
Run Code Online (Sandbox Code Playgroud)
我想过简单地使用ctypes访问dll,但我认为这对C#/ .Net不起作用.由于我们实验室的限制,我需要使用一个vanilla Python发行版+插件模块(即不是IronPython或CPython.)我看了Python for .NET,但我不确定这实际上是否有用.我是.Net的n00b,但在Java,C++和Python方面有很多经验.以前有人遇到过这种情况和一个好的解决方案
编辑:
通过下面的解释,我在python解释器中导入了clr,然后尝试导入fooBar库,结果如下:
Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Interop.AVMCIFCLib, Version=1.2.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
File name: 'Interop.AVMCIFCLib, Version=1.2.0.0, Culture=neutral, PublicKeyToken=null'
at System.Signature._GetSignature(SignatureStruct& signature, Void* pCorSig, Int32 cCorSig, IntPtr fieldHandle, IntPtr methodHandle, IntPtr declaringTypeHandle)
at System.Signature.GetSignature(SignatureStruct& signature, Void* …Run Code Online (Sandbox Code Playgroud)