Как использовать Marshal.getActiveObject(), чтобы получить 2 экземпляра запущенного процесса с двумя открытыми процессами

В настоящее время мой код использует

SurferApp = Marshal.GetActiveObject("Surfer.Application") as Surfer.Application

чтобы получить работающий экземпляр программного обеспечения под названием Surfer, ради простоты мы можем заменить Surfer to Word, о котором все знают. Теперь допустим, что у меня запущено 2 приложения MS Word, и я хочу, чтобы они оба использовали Marshal.GetActiveObject()Как я могу получить оба запущенных экземпляра и связать каждый с отдельным объектом?

3 ответа

Решение

Marshal.GetActiveObject возвращает первый найденный экземпляр в ROT (таблица запущенных объектов). Если у вас более одного экземпляра, работающего с одним и тем же именем / идентификатором, вы должны получить его напрямую из ROT.

Несколько ссылок для начала:

В дополнение к ссылкам в принятом ответе я нашел следующее очень полезное для обхода ROT, особенно если интересующее вас приложение - AutoCAD:

http://adndevblog.typepad.com/autocad/2013/12/accessing-com-applications-from-the-running-object-table.html

Принятый ответ содержит только ссылки. Я извлек максимально краткий ответ из процитированного материала. я даю вамMarshalGetActiveObjectфункция, которая работает так же, как старыйMarshal.GetActiveObjectделал.

      
[DllImport("oleaut32.dll", PreserveSig = false)]
private static void GetActiveObject(ref Guid rclsid, IntPtr pvReserved, [MarshalAs(UnmanagedType.IUnknown)] out object ppunk)

[DllImport("ole32.dll")]
private static int CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] string lpszProgID, out Guid pclsid)

public static object MarshalGetActiveObject(string progId)
{
    Guid clsid;
    object obj = null;
    if (CLSIDFromProgID(progId, out clsid) == 0)
        GetActiveObject(ref clsid, IntPtr.Zero, out obj);

    return obj;
}

Другие вопросы по тегам