2017-11-08 17 views
-1

私は2つのアプリケーションを持っています。最初のアプリケーションは、完全に正常に動作するRunningObjectTable ..にProgIDを持つオブジェクトを登録します。他のアプリケーションは、ProgIDによってそのオブジェクトにアクセスする必要があります。RunningObjectTable(C#)のオブジェクトへのアクセス

私は3つの可能な方法を見つけました..しかし、ただ1つしか動作せず、なぜ私はこれらの方法の違いがありますか?

まず: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

3番目の方法では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); 
} 
関連する問題