2015-11-06 17 views
9

開いているアプリケーションの複数インスタンス(WRQ Reflection)への接続を作成しようとしています。アプリケーションの実行中の複数のインスタンスに接続する

Session appInstance = (Marshal.GetActiveObject("Reflection4.Session.8") as Session); 

しかし、私は複数のインスタンスに接続できるようにしたいと思います:開かれた最初のインスタンスに接続すると、これを用いて微細です。私は多くの研究をしており、thisのような有益なリンクを見つけましたが、この状況では開いているすべてのインスタンスが同じprogIdを持っているため、この解決策は動作しません。

私はまた、明らかに各インスタンスごとに異なるウィンドウハンドルを調べてみました。これを使用する:

Process[] processes = Process.GetProcessesByName("r4win"); 
foreach (Process p in processes) 
{ 
    IntPtr windowHandle = p.MainWindowHandle; 
    string handle = windowHandle.ToString(); 

    MessageBox.Show(handle); 
} 

しかし、私はウィンドウハンドルを介してウィンドウへの接続を作成する方法を見つけることができませんでした。

ご協力いただければ幸いです。

追加コード:このシナリオでは

void TestROT() 
{ 
    // Look for open instances 
    string[] progIds = {"Reflection4.Session.8"}; 

    List<object> instances = GetRunningInstances(progIds); 

    foreach (object refleObjs in instances) 
    { 
     Session session = refleObjs as Session; 
     session.Transmit("12345"); 
    } 
} 

、私は、ターゲットアプリケーションの実行中の2つのインスタンスを持っています。上記のコードでは、12345という文字列をアプリケーションの同じインスタンスに2回送信します。

最初のインスタンスに12345を送信し、2番目のインスタンスに12345を送信する必要があります。

+1

接続するとどういう意味ですか?何をすべきか?あなたが投稿したコードは、COMオートメーションに関するものであり、いかなる種類の接続でもありません。それは例えば約です。 Interopを使用してWordを駆動します。あなたは何をしようとしているのですか?接続はソケット、サービス、WCFなどのことを意味し、オートメーションではない –

+0

PSでもCOMでは、CreateObjectは新しいオブジェクトを作成するか、既存のものを使用し、GetActiveObjectは新しいオブジェクトを作成します。 .NETでは、生のCOMメソッドの代わりにCOM Interopを使用していますが、 –

+0

申し訳ありませんが、正しい用語がわかりません。接続とは、アプリケーションにテキストやコマンドを送信し、画面から情報を読み取る機能を意味します。 –

答えて

5

System.IO.Pipes -namespaceのクラスNamedPipeClientStreamNamedPipeServerStreamを使用して、アプリケーションから別のものにデータを送信できます。あなたの最初のアプリケーションで このようなNamedPipeServerStream実装:あなたが使用してデータを送信することができますserverclientを接続した後

NamedPipeClientStream clientStream = new NamedPipeClientStream("MyApp1"); 
clientStream.Connect(); 

:あなたの第二のアプリケーションで

NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyApp1"); 
pipeServer.WaitForConnection();//wait for connection of client 

場所NamedPipeClientStreamのインスタンスを方法Write

サーバーからのデータの送信:

byte[] test = Encoding.UTF8.GetBytes("Hello World"); 
pipeServer.Write(test, 0, test.Length); 

クライアントからのデータを送信:

byte[] test = Encoding.UTF8.GetBytes("Hello World"); 
clientStream.Write(test, 0, test.Length); 

あなたが受信したバイトを取得するためにReadを使用することができます。このメソッドは、両方のクラスに存在します。

複数のサーバーとクライアントを同時に使用して、より多くのアプリケーションと通信することもできます。

+0

名前付きパイプに精通していないしかし、自動化しようとしているアプリケーションにコードを追加する必要があるように思えますが、この場合は不可能です。 –

0

あなたの質問の説明から、おそらくあなたがしたいのはget all instances of a running COM objectです。

+0

それで、その質問への答えにブログの投稿を使用すると、コードはいくつかの修正が必要であり、リストタイプが欠落していますが、ROTの項目のリストを返します。私はそれらを 'List 'として返していますが、リストから必要な項目を私が使用しているアプリケーションタイプに変換することはできません - 'Session'。を取得していません。参照変換を介してタイプ 'Form2.RunningObject'を 'Reflection4.Session'に変換できません。 –

+0

次のヘルプがありますか? http://stackoverflow.com/questions/24612691/cannot-get-interface-from-different-process-via-rot – Joe

関連する問題