编辑:虽然切线相关,但标记的“重复”并不是这个问题的真正重复,更重要的是不回答这个问题(因为问题不同)。我正在使用 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);
}
提前致谢。