2015-11-06 18 views
9

Ich versuche, eine Verbindung zu mehreren Instanzen einer geöffneten Anwendung (WRQ Reflection) zu erstellen. Anschluss an die erste Instanz, die geöffnet wurde, ist in Ordnung mit diesem:Verbinden mit mehreren laufenden Instanzen einer Anwendung

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

Aber ich möchte in der Lage sein, mehrere Instanzen zu verbinden. Ich habe viel Forschung betrieben und einige hilfreiche Links wie this gefunden, aber diese Lösung wird in dieser Situation nicht funktionieren, da alle offenen Instanzen das gleiche ProgID haben.

Ich habe auch versucht, die Fenstergriffe zu betrachten, die offensichtlich für jede Instanz unterschiedlich sind. Verwenden Sie dies:

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

    MessageBox.Show(handle); 
} 

Aber ich konnte nicht herausfinden, wie Sie eine Verbindung zu dem Fenster über den Fenstergriff erstellen.

Jede Hilfe wird geschätzt.

Zusatzcode:

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"); 
    } 
} 

Für dieses Szenario Ich habe 2 Instanzen der Zielanwendung läuft. Im obigen Code wird die Zeichenfolge 12345 zweimal an dieselbe Instanz der Anwendung gesendet.

Ich brauche es 12345 an die erste Instanz und dann 12345 an die zweite Instanz zu senden.

+1

Was meinst du connect? Um was zu tun? Der Code, den Sie gepostet haben, bezieht sich auf COM-Automatisierung, nicht auf irgendeine Art von Verbindung. Es geht um zB. Word mit Interop fahren. Was versuchst du zu machen?Connection impliziert Dinge wie Sockets, Dienste, WCF usw., keine Automatisierung –

+0

PS selbst in COM, CreateObject wird ein neues Objekt erstellen oder ein vorhandenes verwenden, während GetActiveObject ein neues erstellen wird. In .NET obwohl Leute COM Interop anstelle der rohen COM-Methoden verwenden –

+0

Entschuldigungen, nicht sicher von der richtigen Terminologie. Mit connect meine ich die Fähigkeit, Text und Befehle an die Anwendung zu senden und Informationen vom Bildschirm zu lesen. –

Antwort

5

Sie können die Klassen NamedPipeClientStream und NamedPipeServerStream im System.IO.Pipes -namespace verwenden, um Daten von Ihrer Anwendung an eine andere zu senden. In Ihrer ersten Anwendung eine NamedPipeServerStream wie folgt implementieren:

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

Ein Beispiel von NamedPipeClientStream in Ihrer zweiten Anwendung:

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

Nach dem client auf die server Anschluss können Sie die Daten mithilfe der schicken methode Write:

Senden von Daten von Ihrem Server:

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

Senden von Daten vom Client:

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

Sie können Read verwenden, um die empfangenen Bytes zu erhalten. Diese Methode existiert in beiden Klassen.

Sie können auch mehr als einen Server und einen Client gleichzeitig verwenden, um mit mehr Anwendungen zu kommunizieren.

+0

Ich bin nicht vertraut mit Named Pipes , aber es klingt so, als müsste ich der Anwendung, die ich zu automatisieren versuche, Code hinzufügen, was in diesem Fall nicht möglich ist. –

0

Aus der Beschreibung in Ihrer Frage, was Sie vielleicht tun möchten, ist get all instances of a running COM object.

+0

Ok, also mit dem Blog-Post in der Antwort auf diese Frage, der Code erfordert einige Änderungen und fehlt die Liste Typen, aber es gibt eine Liste von Elementen in der ROT.Ich gebe sie als 'List ' zurück, was gut funktioniert, aber ich kann die Elemente, die ich will, nicht in den Anwendungstyp konvertieren, den ich verwende - 'Session'. Kann _Cannot den Typ 'Form2.RunningObject' über eine Referenzkonvertierung in 'Reflection4.Session' konvertieren? –

+0

Hilft die folgende Hilfe? http://stackoverflow.com/questions/24612691/cannot-get-interface-from-different-process-via-rot – Joe

Verwandte Themen