|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
Что такое Автоматизация в OLE и COM18.07.2015, 18:08. Показов 6961. Ответов 20
Метки нет (Все метки)
Здорова!
Только что прочитал главу про автоматизацию это типо не COM или COM хз. ниче не понял. Это типо OLE или чем OLE отличается от COM? В COM используются интерфейсы IUnknown и IClassFactory а при автоматизации там уже какой то другой интерфейс IDispatch. Там есть примеры с VBA типо автоматизация используется с VBA в экселе. Кто разбирался в автоматизации? Вообще сложная тема, сложнее чем COM. по ходу. Мб. кто приведет парочку простых примеров. В книге вроде примеры сложные, там 3 примера с exel, там часы и 2 таблицы каких то и два примера непонятных каких то клиентов. А щас автоматизация используется? Книга старая за 2003 года ![]() Добавлено через 2 часа 33 минуты вообще я глянул правильно называется технология OLE Automation.
0
|
|
| 18.07.2015, 18:08 | |
|
Ответы с готовыми решениями:
20
OLE автоматизация Автоматизация через OLE объект |
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
| 19.07.2015, 21:01 [ТС] | |
|
Чуток подчитал понял что есть OLE Automation и COM. OLE Automation это когда через скриптовый язык можно из программы управлять объектом COM. Скриптовые языки как бы не поддерживают указатели, а COM чтобы использовать там через указатели его используют получаем указатели на IUnknown и другие COM итерфейсы и через них управляем объектом COM.
В OLE Automatin там указтели вроде как не используются, в скриптовых языках нету указателей. Типо COM от OLE вроде этим отличается или хз. я еще не понял. От еще я не пойму, там в OLE используется интерфейс IDispatch. Через этот IDispatch создается карта диспетчеризации. Типо карта функций которые COM объекта. А дальше создается какой то промежуточный класс который управляет этим классом COM. Типо класс CDriver : public COleDispatchDriver, этот класс COleDispatchDriver этот класс хранит указатель на IDispatch компонента COM. Типо в клиенте мы делаем класс управляющий нашим объектом и переопределяем функции которые будут вызывать функции нашего COM объекта. Там существует функция invoke через которую мы вызываем функции нашего объекта. Ничего не ясно зачем так делать? В COM там сразу есть объект COM, к нему мы добавляем интерфейсы наследники от IUnknown и все. В OLE идет все по другому, тут IDispatch главный интерфейс и вообще я не разберу смысла OLE. Теорию прочитал смутно понял, щас попробую первый реальный пример из книги разобрать, мб. тогда стане яснее. Мб. кто что дополнит ? Вообще щас пишут что ActiveX всебя все включает и OLE и COM. Вообще получается OLE это как бы частный случай COM? А ActiveX это общее для них название, я до ActiveX еще не дошел.Добавлено через 1 минуту Вообще смутная такая теория. Тип VARIANT например смутная фигня.
0
|
|
|
Ушел с форума
|
|||
| 19.07.2015, 22:49 | |||
|
В принципе, любой класс, если он реализует IUnknown и совместим с этим интерфейсом на двоичном уровне, может рассматриваться, как COM-совместимый. Например, интерфейсы DirectX - прекрасное тому подтверждение, хотя они не создаются стандартным способом, т.е. через CoCreateInstance, к примеру, и для них не вызывается CoInitialize(Ex). OLE (Object Linking and Embedding), она же ActiveX - это технология внедрения COM-объектов в другие приложения и документы. Ключевым моментом в OLE/ActiveX является реализация с обеих сторон определенного набора интерфейсов. Т.е. есть приложение-контейнер, например MS Office, и есть некий объект, который загружается в документ MS Office, так вот, они взаимодействуют друг с другом посредством заранее определенного в спецификации OLE набора интерфейсов. Например, когда контейнер выполняет отрисовку объекта, он вызывает его реализацию интерфейса IViewObject, когда сохраняет на диск - тогда IPersistStream. И т.д. Некоторые из этих интерфейсов обязательны, другие опциональны. OLE Automation - технология, позволяющая использовать COM-объекты в сценариях типа VBA, VBScript и JScript. Здесь все вращается вокруг интерфейса IDispatch. Скриптовые языки вызывают методы COM-объекта через IDispatch::Invoke, другие методы этого интерфейса необходимы для получения динамической информации о типах. упрощают жизнь, но сильно осложняют понимание сути технологии. Осваивать COM нужно именно в "сыром" виде. То есть, голые интерфейсы, ко-классы, фабрики, DllGetClassObject, подсчет ссылок, apartments, CoInitialize(Ex), inproc/outproc/remote, серверы в exe, IDL, суррогатные процессы, безопасность, моникеры... И уже только потом читать книжки для продвинутых и использовать ATL, StlSoft и тому подобное. На вопрос: "вот нафига так запутанно делать" применительно к COM есть простой ответ: реализация COM-компонентов в большинстве своем - рутина. Нужно описать интерфейс в IDL-файле, затем скомпилить его и получить библиотеку типов. Потом создать dll, реализовать в ней DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer. Потом написать фабрику классов, в ней реализовать IUnknown и IClassFactory. Потом реализовать сам объект, в нем реализовать, как минимум, IUnknown и свой интерфейс. Потом написать код регистрации компонента в реестре. И только после этого писать сами тела методов. Ах, да, забыли про поддержку агрегации (про нее все "забывают"). Обертки в этом смысле могут сильно упростить жизнь, причем не только на стороне COM-сервера, но и на стороне клиентского кода (см., например, CComPtr с автоматическим подсчетом ссылок). Короче, осваивать это все нужно не спеша и капитально, и начинать с самых азов.
3
|
|||
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
| 20.07.2015, 17:26 [ТС] | |
|
Убежденный, А ты не знаешь как запустить в отладчике для OLE объекта? Я пример сделал один и он получился. Хочу его в отладчике запустить. Там excel подгружает этот объект через макрос на VBA. Смысл в том что мы настраиваем отладчик чтобы он ожидал когда мы подгрузим через эксель этот объект.
Делал как в книге написано, там VS - 6, у меня VS - 10, оно отличается. та нужно зайти в меню проект и выбрать свойства проекта, и на вкладке отладка вроде ввести адрес exe файла COM и запустить отладчик и он запустится и будет ждать когда мы через excel загрузим этот файл и будет выводить и показывать какие функции грузятся. У меня никак не получается этот режим запустить в VS - 10, получается подключится к процессу. Например мы через excel подгружаем этот модуль, а затем уже через отладчик я подключаюсь к созданому процесу, но это не то, нужно чтобы отладчик ожидал когда excel загрузит модуль, чтобы посмотреть сколько раз вызывается функция InitInctence. Хз. как это сделать. Попробую еще поковырятся в настройках
0
|
|
|
Ушел с форума
|
|
| 20.07.2015, 17:42 | |
|
Можно так, например: поставить брейкпоинт в определенном методе объекта,
затем приаттачиться отладчиком к Excel и ждать, пока брейкпоинт сработает. В WinDBG можно, приаттачившись к Excel, сделать команду "sxe ld имя-dll" и тогда брейк сработает при загрузке нужной dll. Я предпочитаю такие вещи отлаживать через OutputDebugString/DbgPrint, а вывод наблюдать через отладчик ядра, выведенный на второй монитор ![]() Намного удобнее, чем все остальное.
1
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||
| 20.07.2015, 18:13 [ТС] | ||
|
После щелчка кнопки GO на панели инструментов Debug программа запуститься и будет ждать, когда ее активирует клиент. Теперь можно запустить из Windows и клиенскую программу (если она еще не запущена) и создать с ее помощью компонентский объект. В результате программа. запущенная из-под отладчика, должна сконструировать объект. Будет неплохо, если вы включите оператор TRACE в конструктор объекта. Не забудьте зарегистрировать программу компонента иначе клиент ее не найдет." Это для VS6 В VS 10 там такого нету. Как мне посмотреть что конструктор выводить? Если я приатачусь то я не увижу запуска компонента, если сделать так как ты говоришь, то конструктора не будет. Я просто подключусь и все. Я уже пробовал подключатся к процессу, там можно. Но че то никак не найду режим ожидания. как описано в книге. вот что я выставляю в настройках отладки и ни в какой режим ожидания отладчик не переходит Если я ставлю "присоединится" в "да" то да оно присоединяется, но это не то что нужно вроде.
0
|
||
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
| 20.07.2015, 18:19 [ТС] | |
|
так что в VS10 такое как в книге описывается походу нельзя сделать или я настройки не найду где поменять, по идее когда мы указываем путь уже отладчик должен в режим ожидания переходить, а он не переходит, а просто запускает программу в режиме отладки, а должен ждать пока я с excel подгружу эту программу. Так в книге написано.
![]() Добавлено через 3 минуты Убежденный, так как ты описал приатачить я знаю как делать, оно работает, а от режим ожидания запуска из excel как сделать хз. приатачить отладчик если не запущен процесс мы не можем, нужно сначала запустить с excel процесс, а затем уже присоединятся. А в книге написано что отладчик должен ждать когда мы из excel подгрузим exce, а он у меня ничего не хочет ждать, просто отладку проводит и все.
0
|
|
|
Ушел с форума
|
|
| 20.07.2015, 19:06 | |
|
Ну я так понимаю, что запускать под отладчиком нужно сам Excel,
причем с параметром /Embedding.
1
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||
| 20.07.2015, 20:12 [ТС] | ||
|
0
|
||
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
| 21.07.2015, 07:23 [ТС] | |
|
Убежденный, разобрался, в режим ожидания переводится легко, от такие настройки прописываем как на скрине:
И потом запускаем отладку и она переходит в "режим ожидания", дальше с экселя уже подгружаем модуль. Правда функций не видно как вызываются в них TRACE нужно добавлять, но все работает так как нужно
0
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
| 21.07.2015, 18:45 [ТС] | |
|
Вообще лучше Excel запускать в режиме отладчика или подключатся к процессу. Это все фигня как в книге написано, оно для dll не работает.
0
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
| 24.07.2015, 14:28 [ТС] | ||||||
|
Создал COM объект с поддержкой OLE автоматизации. Теперь нужно создать клиент программу на С++ в которой будет этот объект использоваться. Пишут в книге что visual studio вместе с компонентом геренирует библиотеку TLB, в папке Debug или Release должен быть файл c расширением .tlb, у меня его нету. По этой tlb мы можем создавая клиент генерировать классы контроллера. В debug находится 3 файла с расширением .exe, .ilk и pdb. С .tlb нету. Почему visual studio его не создает?
В самом проекте мастер создает файл с расширением .idl в нем находится описание интерфейса объекта В книге написано: "В любом случае Visual C++ при сборке проекта компонента вызывает утилиту MIDL, которая считывает ODL файл и генерирует двоичный TLB файл в каталоге Debug или Release проекта" ODL-файл это тоже самое что и IDL-файл. Почему у меня TLB не создается хз. Щас попробую переименовать IDL в ODL мб. создаст, но это я думаю не то, если я переименую оно мб. не будет в него добавлять интерфес. Пишут что мастер только добавляет, но не редактирует этот файл. Добавлено через 5 минут Переименовал не помогает, в самом файле в начале написано:
Добавлено через 3 минуты В общем пошарив по файлах нашел где создается. Там в проекте две папки Debug одна находится в корне туда создаются exe файлы и папка другая находится там где исходные файлы лежат и там создалась .tlb и чем эти папки Debug отличаются? Там где исходники та папка Debug там создаются вспомогательные файлы да? А тот Debug где выше там создаются исходники? Типо Debug где исходники там создается мусор да? Добавлено через 14 часов 31 минуту Пытаюсь создать клиент на С++ и в нем использовать excel но ничего не получается. В книге написано для того чтобы создать классы-контролеры в папке где находится office есть файл Excel8.olb и его можно также загрузить с мастера VS так же как и tlb файл. В общем пытался я найти этот файл такого нету, понятно что нету у меня office14 стоит, и excel вроде 2010. Пытался найти хоть какие то файлы olb нашел MSWORD.OLB, MSPPT.OLB, MSOUTL.OLB, MSACC.OLB, все других нету. файла похожего на excel нету. Пытался найти tlb. может там tlb для excel есть. Там был один MSPUB.TLB, но это похоже не то. Кто знает как excel можно использовать как контролер и где находятся для него файлы olb или tlb чтобы из них сгенерировать классы? Добавлено через 1 минуту Вообще то книга старая за 2003 год, мб. щас excel по другому подключается? Добавлено через 5 минут Я только что выбрал не tlb файл, а выбрал excel.exe и там оттуда можно портировать классы? Что это за фигня? Это что щас уже в самом exe файл используется как tlb?
0
|
||||||
|
Неэпический
|
|
| 24.07.2015, 14:30 | |
|
А не кажется, что всей этой Вашей куче вопросов по OLE и COM место в разделе "C++: COM & OLE", а не в "С++ для начинающих"?
0
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
| 24.07.2015, 14:33 [ТС] | |
|
Да пробовал так получить интерфейс ieExcporel.exe ничего не вышло
, пишет что не найдена библиотека типов. а для excel.exe все найдено, значит что получается? Получается что в exe файле может хранится библиотека типов?
0
|
|
|
Ушел с форума
|
|
| 24.07.2015, 14:36 | |
|
1
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|||||||
| 24.07.2015, 19:53 [ТС] | |||||||
|
Вообще я с версиями запутался как оно происходит регистрация объектов? От я глянул компонентов библиотекой типов в cомой папке где находится ie11 вроде нету. Значит что получается? Получается они находятся в system32? По идее они должны там быть зарегистрированы и отдуда подгружаться. Раз у меня ie11 на сайтах определяется как нормальный современный браузер, то это значит что он использует последнюю версию компонента видимо? От компонент чтобы использовать нужно знать progID правильно? Получается что когда мы создаем новую версию приложения в системе регистрируется новый progID? Но это по идее не правильно, для новой версии компонента создается по идее новый GUID, а progID остайотся старый какой и был. Тогда получается если у меня в системе зарегистрирован новый компонент у меня бы приложение браузер MFC использовало бы новый компонент, а почему он у меня использует старый? От непонятный вопрос: первая версия модуля. progID у нас допустим "MyProg" и CLASID 11111 допустим. Выпускаем мы новую версию компонента и что у нас будет что изменится? ProgID без изменений иначе в программах не будет запускаться, а изменится CLASSID? Это больше всего подходит. Добавлено через 2 минуты Щас проверю на практике, посмотрим что за компонент подгружается и где он находится ![]() Добавлено через 5 минут не ошибся в IDR_MAINFRAME там progID моей программы которая будет создана, а не подгружаемого модуля, короче не то. Добавлено через 4 часа 45 минут Разбираю пример с excel там подгружают модуль excel через progID "Excel.Application.8" с помощью функции:
![]() Добавлено через 8 минут нашел интерфейсы IWebBrowser и IWebBrowser2 там можно посмотреть где находится com объект и tlb файл и версию, у меня 1.1, мб. другой и нету хз., он оказывается находится в ieframe.dll, походу и dll в ресурсах хранит файлы библиотеки типов. excel еще не нашел. Это походу OLE объекты реально сильно расширяют возможности языка . Сколько оказывается доступных возможностей открывается, сколько функций и интерфейсов, там их немеряно.
0
|
|||||||
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
| 24.07.2015, 20:02 [ТС] | |
|
Там в этом описании интерфейса нету самого главного названия progID. И как же мне его использовать?
непонятная инфа, пишут что это control. ну и от что это за control? а excel.exe тогда что получается и он тоже контрол? Контрол я понимаю это из него можно создать контролеры для интерфейсов, просто сгенерировать. А как его подключить? Это что получается его можно только подключить по clasid?
0
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
| 24.07.2015, 20:04 [ТС] | |
|
Подключаемся ребятки, что то я никак не пойму что то за интерфейсы, похоже их то и использовать нельзя.
0
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
| 24.07.2015, 20:11 [ТС] | |
|
Вот нашел один из интерфейсов для excel _Aplication я его использую в программе, там написано где файл находится, но там нету progID самого компонента
ну и где мне найти progID для файла EXCEL.EXE???? Ну смелее не стесняйтесь, хелп!
0
|
|
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
| 24.07.2015, 20:23 [ТС] | |
|
Щас посмотрю в реестре, возможно имя компонента нужно брать из этой строки: Microsoft.Office.Interop.Excel где Excel возможно и есть имя хз.
Добавлено через 6 минут Да глянул в реестре есть там Excel.Application и excel.application14, да у них одинаковые clsid. Но откуда я знаю что именно excel.application мне нужно использовать? Где это все написано? Если бы я не глянул в книге и в реестре я бы и не знал что их нада использовать. Где должно быть записано progID компонента по нормальному? Вопрос открыт, откуда я должен знать что у меня нужно использовать идентификатор excel.applicatio14. а не какой то excel другой? Добавлено через 1 минуту Это что все методом тыка ищется? Добавлено через 1 минуту В книге читал что в TLB файле должны все данные хранится, ну да библиотека типов у меня хранится в EXCEL.EXE и как мне глянуть эту инфу?
0
|
|
| 24.07.2015, 20:23 | |
|
Помогаю со студенческими работами здесь
20
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? Что такое IIS и что такое PWS? Почему одно без другого не работает? Что такое напряжение и что такое сила тока с позиции заряженных частиц
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|