Использование позднего связывания для получения конкретного экземпляра Excel в C # - PullRequest
3 голосов
/ 13 октября 2009

Сразу после небольшой помощи с поздним связыванием.

Я пытаюсь поздно связать Excel, и у меня нет проблем с этим. Только когда у меня открыто более одного экземпляра Excel, я сталкиваюсь с некоторыми проблемами.

Я хотел бы иметь возможность определить, к какому экземпляру Excel привязываться (и событиям ссылки и т. Д.). Основная причина в том, что у меня есть приложение, которое открывает документ Excel из стороннего инструмента, а события не обрабатываются. Я хочу иметь возможность подключиться к конкретному экземпляру Excel, который, как я знаю, открыт для отслеживания событий. Проблема только в том, что Excel уже открыт пользователем (неважно, как).

Если Excel открывается после привязки, очевидно, у меня нет проблем. Это только когда Excel уже открыт.

Кажется, что привязка выполняется к первому открытому хранилищу.

Вот фактический код:

 Type excelType = Type.GetTypeFromProgID("Excel.Application");

 // Throw exception if the type wasn't found
 if (excelType == null)
     throw new Exception(error);

 //Get the Excel.Application Type by creating a new type instance
 excelApplication = Marshal.GetActiveObject("Excel.Application");

 //Throw exception if the object couldn't be created
 if (excelApplication == null)
     throw new Exception(error);

 this.withEvents = withEvents;

 //Create link between the Word.Applications events and the ApplicationEvents2_WordEvents class
 if (this.withEvents)
 {
     excelEvents = new ExcelApplicationEvents();

     //holds the connection point references of the Word.Application object
     IConnectionPointContainer connectionPointContainer = excelApplication as IConnectionPointContainer;

     //Find the connection point of the GUID found from Red Gate's .Net Reflector
     Guid guid = new Guid("00024413-0000-0000-C000-000000000046");
     connectionPointContainer.FindConnectionPoint(ref guid, out connectionPoint);

     //Advise the Word.Application to send events to the event handler
     connectionPoint.Advise(excelEvents, out sinkCookie);

     excelEvents.WorkbookBeforeSaveEvent += new EventHandler<WorkbookEventArgs>(ExcelEventsWorkbookBeforeSaveEvent);
 }

Есть идеи?

Приветствия

Dale.

1 Ответ

4 голосов
/ 13 октября 2009

Для получения конкретного экземпляра Excel необходимо использовать AccessibleObjectFromWindow API .

Это хорошо объясняется в статье Эндрю Уайтчепела.

Получение объекта приложения в дополнении Shimmed Automation .

Однако вы хотите выполнить его с использованием позднего связывания. Это подробно описано divo здесь: Как использовать позднее связывание для получения экземпляра Excel .

...