我有两个申请。第一个应用程序在RunningObjectTable中注册一个带ProgID的对象..它完全正常。另一个应用程序应该通过ProgID访问该对象。
我找到了三种可能的方法......但是只有一种方法有用,我想知道为什么......这些方法之间有什么区别?
首先:IRunningObjectTable.GetObject(...) =>不工作
Spell
第二:Marshal.GetActiveObject(...) =>不工作
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
第三:Activator.CreateInstance(...) =>作品
object myObj = Marshal.GetActiveObject("myProgId"); // => throws an exception: MK_E_UNAVAILABLE
答案 0 :(得分:0)
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);
}