连接到应用程序的多个正在运行的实例

时间:2015-11-06 09:04:46

标签: c# winforms

我尝试创建与打开的应用程序的多个实例的连接(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发送到应用程序的同一个实例,两次。

我需要它将12345发送到第一个实例,然后将12345发送到第二个实例。

2 个答案:

答案 0 :(得分:5)

您可以使用NamedPipeClientStream - 命名空间中的类NamedPipeServerStreamSystem.IO.Pipes将数据从您的应用程序发送到另一个应用程序。 在您的第一个应用程序中,实现NamedPipeServerStream,如下所示:

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

在您的第二个应用程序中放置NamedPipeClientStream的实例:

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

client连接到server后,您可以使用方法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来获取接收的字节数。这两种方法都存在这种方法。

您还可以同时使用多个服务器和一个客户端与更多应用程序进行通信。

答案 1 :(得分:0)

根据您问题中的描述,您可能想要做的是get all instances of a running COM object