我正在创建一个应用程序,需要跟踪进程何时启动,然后在事件结束时引发事件。
我的代码运行完美,并且完全符合我在英语机器上的需要,但是当我在法语机器上运行相同的应用程序时,它会失败。
这是失败的代码
qstart = new WqlEventQuery("__InstanceCreationEvent",
new TimeSpan(0, 0, 0, 0, 5),
"TargetInstance isa \"Win32_Process\"");
qstop = new WqlEventQuery("__InstanceDeletionEvent",
new TimeSpan(0, 0, 0, 0, 5),
"TargetInstance isa \"Win32_Process\"");
try
{
using (wstart = new ManagementEventWatcher(qstart))
{
wstart.EventArrived += new EventArrivedEventHandler(ProcessStarted);
Log.DebugEntry("BeginProcess() - Starting wstart Event");
wstart.Start();
}
}
catch (Exception ex)
{
Log.DebugEntry("error on wstart: " + ex.Message);
}
using (wstop = new ManagementEventWatcher(qstop))
{
wstop.EventArrived += new EventArrivedEventHandler(ProcessStopped);
Log.DebugEntry("BeginProcess() - Starting wstop Event");
wstop.Start();
}
错误在尝试启动查询时命中: wstart.Start();
并为此做同样的事情 wstop.Start();
我只能猜测它与语言和查询字符串有关,但我抓着稻草。
它出现的错误是: “demande non analysable”
感谢任何帮助!
马丁
编辑:在2台相同的机器上测试,唯一不同的是第一次启动时选择的语言。
答案 0 :(得分:6)
显然是因为你指定的间隔太小了...我只是在法国Windows XP SP3上试过它,并得到了同样的错误。但是,如果我改变间隔为1秒,它工作正常......似乎你不能指定一个小于1秒的间隔。不知道为什么这只发生在非英语操作系统上,但是......
编辑:实际上我刚刚意识到它可能是WqlEventQuery
中的一个错误。 qstart.QueryString
看起来与CurrentCulture =“en-US”:
select * from __InstanceCreationEvent within 0.005 where TargetInstance isa "Win32_Process"
但是使用CurrentCulture =“fr-FR”,它看起来像是:
select * from __InstanceCreationEvent within 0,005 where TargetInstance isa "Win32_Process"
(注意数字格式的差异)
显然WqlEventQuery
中的代码并没有强制使用不变文化来格式化数字,这使得查询在小数分隔符不是“。”的文化中不正确。
如果强制CurrentCulture
到CultureInfo.Invariant
,查询工作正常,即使在法语操作系统上也是如此。您也可以手动编写WQL查询...