5

我正在创建一个需要跟踪进程何时启动的应用程序,然后在它完成时引发一个事件。

我的代码可以完美运行,并且完全符合我在英语机器上的需要,但是当我在法语机器上运行相同的应用程序时它会失败。

这是失败的代码

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(); 做同样的事情

我只能猜测它与语言和查询字符串有关,但我正在抓住稻草。

它提出的错误是: “要求不可分析”

任何帮助将不胜感激!

马丁

编辑:在 2 台相同的机器上测试,唯一的区别是第一次启动时选择的语言。

4

1 回答 1

6

显然是因为您指定的间隔太小......我刚刚在法语 Windows XP SP3 上尝试过,得到了同样的错误。但是,如果我将时间间隔改为 1 秒,它就可以正常工作了……看来您不能指定小于 1 秒的时间间隔。不知道为什么这只发生在非英语操作系统上,但......

编辑:实际上我刚刚意识到这可能是WqlEventQuery. CurrentCulture = "en-US"的qstart.QueryString样子:

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不会强制使用不变的文化来格式化数字,从而使查询在小数点分隔符不是“。”的文化中不正确。

如果您强制使用CurrentCultureto CultureInfo.Invariant,即使在法语操作系统上,查询也可以正常工作。您也可以手动编写 WQL 查询...

于 2011-05-11T09:39:45.187 回答