【问题标题】:Accessing object in RunningObjectTable (C#)在 RunningObjectTable (C#) 中访问对象
【发布时间】:2018-04-21 07:37:50
【问题描述】:

我有两个应用程序。第一个应用程序在 RunningObjectTable.. 中使用 ProgID 注册一个对象,它工作得很好。其他应用程序应通过 ProgID 访问该对象。

我找到了三种可能的方法.. 但只有一种有效,我想知道为什么.. 这些方法之间有什么区别?

首先:IRunningObjectTable.GetObject(...) => 不工作

IRunningObjectTable rot;
GetRunningObjectTable(0, out rot); // => ole32.dll
IMoniker moniker;
CreateFileMoniker("myProgId", out moniker); // => ole32.dll
object myObj;
rot.GetObject(moniker, out myObj) // => myObj stays null

第二个:Marshal.GetActiveObject(...) => 不工作

object myObj = Marshal.GetActiveObject("myProgId"); // => throws an exception: MK_E_UNAVAILABLE

第三:Activator.CreateInstance(...) => 有效

object myObj = Activator.CreateInstance(Type.GetTypeFromProgID("myProgId"), true);

【问题讨论】:

  • 第三种方式根本不使用ROT,它创建一个新实例。如果您没有注意 GetObject() 返回的错误或异常,那么您将无法知道“它不起作用”的原因。 Roman 为 irotview 实用程序提供了一个很好的替代品:alax.info/blog/1444

标签: c# .net createinstance


【解决方案1】:

ROT 的可用内容取决于用户权限。很可能您正在使用不同的用户权限启动应用程序,或者其中一个应用程序是以“以管理员身份运行”模式启动的

使用下一个代码获取 ROT 的内容,并比较两个应用程序中的内容。

IRunningObjectTable rot;
GetRunningObjectTable(0, out rot);

IEnumMoniker monikerEnumerator;
rot.EnumRunning(out monikerEnumerator);

IntPtr pNumFetched = new IntPtr();
IMoniker[] monikers = new IMoniker[1];

while (monikerEnumerator.Next(1, monikers, pNumFetched) == 0)
{
    IBindCtx bindCtx;
    CreateBindCtx(0, out bindCtx);
    string displayName;
    monikers[0].GetDisplayName(bindCtx, null, out displayName);
    // Console.WriteLine(displayName);
}

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2011-06-07
    • 2019-01-05
    相关资源
    最近更新 更多