Всем привет!
Необходимо через COM-интерфейс из стороннего приложения обратиться к уже открытому Цивилу (или запустить его) и, скажем, нарисовать коготочку.
Ниже приведен код, который это делает. (Написано для 2012 Автокада на основе этого:
http://through-the-interface.typepad.com/through_the_interface/2007/12/launching-autoc.html)
Извините, вам запрещён просмотр содержимого спойлеров.
Но при использовании этого метода всплывает пара проблем:
(№1)во первых, если у нас одновременно открыт Автокад, Цивил и Map 3D, то
acadApp = Marshal.GetActiveObject("AutoCAD.Application.18.2") присоединится к тому, кто был раньше всех запущен.
А во-вторых (№2), даже если никакого автокада не запущено, то при создании экземпляра приложения через
Activator.CreateInstance нет гарантии того, что запустится именно цивил.
Если проявится хоть одна проблема (т.е. мы присоединились НЕ к Цивилу), то на этой строке
civilApp = acadType.InvokeMember("GetInterfaceObject", BindingFlags.InvokeMethod, null, acadApp, new object[] { "AeccXUiLand.AeccApplication.9.0" });
вылетит
TargetInvocationException с
ex.InnerException.HResult == -2147467259.
Вопрос: как обратиться к нужному автокаду с цивилом?
Ниже приведены еще пара "черномагических" способов, которые, тем не менее, я не смог заставить работать на себя.
Первый:Лезем в Running Object Table, выбираем объекты с CLSID Автокада и пытаемся получить из них объекты Цивила. Здесь появляется проблема №1. Даже если записей в ROT несколько, каждая запись является экземпляром первого открытого автокада.
Извините, вам запрещён просмотр содержимого спойлеров.
Второй:Не знаю, насколько вообще этот способ корректен, делалось по советам отсюда
http://stackoverflow.com/questions/770173/how-to-get-excel-instance-or-excel-instance-clsid-using-the-process-id.
Вкратце: получаем процесс автокада по имени, получаем дескриптор главного окна. С помощью функции
AccessibleObjectFromWindow (
https://msdn.microsoft.com/en-us/library/windows/desktop/dd317978%28v=vs.85%29.aspx) получаем объект, указывая полученный дескриптор и CLSID Автокада.
Извините, вам запрещён просмотр содержимого спойлеров.
Просьба не сильно бить ногами, так как я не волшебник, а только учусь
и могу где-нибудь ошибаться.
В аттаче приложен проект с полными исходниками моих начинаний.