Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问RunningObjectTable(C#)中的对象_C#_.net_Createinstance - Fatal编程技术网

访问RunningObjectTable(C#)中的对象

访问RunningObjectTable(C#)中的对象,c#,.net,createinstance,C#,.net,Createinstance,我有两份申请。第一个应用程序在RunningObjectTable中使用ProgID注册对象。。那很好用。另一个应用程序应该通过ProgID访问该对象 我找到了三种可能的方法。。但只有一个有效,我想知道为什么。。这些方法之间有什么区别 第一:=>不工作 IRunningObjectTable rot; GetRunningObjectTable(0, out rot); // => ole32.dll IMoniker moniker; CreateFileMoniker("myProgI

我有两份申请。第一个应用程序在RunningObjectTable中使用ProgID注册对象。。那很好用。另一个应用程序应该通过ProgID访问该对象

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

第一:=>不工作

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
object myObj = Marshal.GetActiveObject("myProgId"); // => throws an exception: MK_E_UNAVAILABLE
第二:=>不工作

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
object myObj = Marshal.GetActiveObject("myProgId"); // => throws an exception: MK_E_UNAVAILABLE
第三:=>有效


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);
}

第三种方法根本不使用ROT,它创建了一个新实例。如果您没有注意GetObject()返回的错误或异常,那么您就不知道为什么“它不工作”。Roman为irotview实用程序提供了一个很好的替代品: