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