Как использовать 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:
Принятый ответ содержит только ссылки. Я извлек максимально краткий ответ из процитированного материала. я даю вам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;
}