2017-11-08 1 views
-1

두 가지 응용 프로그램이 있습니다. 첫 번째 응용 프로그램은 RunningObjectTable ..에 ProgID가있는 개체를 등록합니다. 이는 정상적으로 작동합니다. 다른 응용 프로그램은 ProgID에 의해 해당 개체에 액세스해야합니다.RunningObjectTable (C#)의 개체 액세스

나는 3 가지 가능한 방법을 찾았습니다. 그러나 하나만 작동하고 왜 그런지 궁금합니다.이 두 가지 방법의 차이점은 무엇입니까?

첫째 : 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(...)는 =>는 ROT의

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

세 번째 방법은 ROT를 전혀 사용하지 않고 새로운 인스턴스를 만듭니다. GetObject()에 의해 반환 된 오류 또는 예외에주의를 기울이지 않으면 "작동하지 않는 이유"를 알 수 없습니다. Roman은 irotview 유틸리티에서 사용할 수있는 훌륭한 대체품을 만들었습니다. http://alax.info/blog/1444 –

답변

0

가능한 컨텐츠를 작동 사용자 권한에 따라 다릅니다. 대부분 다른 사용자 권한으로 응용 프로그램을 시작하거나 응용 프로그램 중 하나가 "관리자 권한으로 실행"모드로 시작되었습니다.

다음 코드를 사용하여 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); 
}