1

编辑:虽然切线相关,但标记的“重复”并不是这个问题的真正重复,更重要的是不回答这个问题(因为问题不同)。我正在使用 Window 服务,而不是独立的用户空间应用程序。

这是我正在使用的内容:

我用 C# 编写了一个 Windows 服务(在 Windows Server 2019 中运行),它通过 COM 与其他软件交互。这个其他软件不是我可以访问源代码的软件,所以我不能更改 COM 注册标志或类似的东西,但它确实注册了自己并有一个 API。

我想使用我的服务中的运行对象表 (ROT) 通过名字对象显示名称获取其他软件的实例,但是从我的服务的角度来看,ROT 始终是空的,即使在服务本身启动一个实例之后也是如此其他软件通过 Process.Start() 返回一个有效的 PID。需要明确的是,这可以在独立的 Windows 控制台或 Windows 窗体应用程序中正常运行,但不能作为服务运行。

该服务被配置为作为该计算机上管理员组中的用户登录。为什么即使在启动进程本身之后,它也看不到 ROT 中的任何内容?

这是一个示例代码片段。在控制台应用程序中运行时,它会计算许多名字对象,在我的服务中运行时,计数器始终为 0,即使在它启动进程之后也是如此。

    [DllImport("ole32.dll")]
    private static extern int CreateBindCtx(uint reserved, out IBindCtx ppbc);
    private static void TestRot()
    {
        IBindCtx context = null;
        IRunningObjectTable rot = null;
        IEnumMoniker monikers = null;
        log.Debug("About to start moniker check");

        CreateBindCtx(0, out context);
        context.GetRunningObjectTable(out rot);
        rot.EnumRunning(out monikers);
        var moniker = new IMoniker[1];

        log.Debug("Beginning moniker loop");
        var counter = 0;

        while (monikers.Next(1, moniker, IntPtr.Zero) == 0)
        {
            counter++;
            var curMoniker = moniker.First();
            string name = null;
            if (curMoniker != null)
            {
                try
                {
                    curMoniker.GetDisplayName(context, null, out name);
                }
                catch (UnauthorizedAccessException)
                {
                    log.Debug($"UnauthorizedAccessException when getting display name for curMoniker");
                }
            }
            log.Debug($"curMoniker: {name}");

        }
        log.Debug("Counted monikers: " + counter);
    }

提前致谢。

4

0 回答 0