Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
Добрый день, друзья. Подскажите, пожалуйста, как правильно должна быть организована работа с COM-объектом в с++? Имеем: 1) зарегистрированный в системе COM-объект стороннего разработчика. Из файлов есть только dll. 2) проект vc++, в который необходимо встроить вызов этого COM-объекта. Работа ведется в Visual Studio 2015. Раньше работала с COM-объектами в vb, delphi и c#, но там нет никаких сложностей с подключением этого объекта, а в с++ буквально застряла. Пыталась использовать способ, найденный в интернете (#import dll, CoInitialize(NULL); ITheObjectPtr myObj(__uuidof(TheObject));), но не срастается, да и не покидает чувство, что где-то что-то надо еще добавить, а вот что и куда? Подскажите, пожалуйста, как? Может быть есть какой-то толковый пример или статья? Заранее благодарю за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 17:55 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 18:24 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
illsРабота ведется в Visual Studio 2015.есть директива #import, которая при компиляции генерирует обёртку для указанного COM-объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 05:20 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
ills(#import dll, CoInitialize(NULL);опс, мне не по глазам Ок, а что конкретно не срослось при таком подходе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 05:23 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
CEMb, не срослось то, что не понятно, как объявить ITheObjectPtr myObj, вернее, где объявить. Мне же надо, чтобы экземпляр объекта в пределах всего проекта был один. Если сделать объявление и инициализацию в пределах процедуры, то все ок, но и работать с объектом можно только в пределах этой процедуры. Фактически если сделать так, то все хорошо: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. А если так, то уже не работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 12:40 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
Siemargl, это точно, в vb таких сложностей нет. За книгу спасибо, поищу(на этом сайте ее нет) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 12:43 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
ills, CoUninitialize в конце работы приложения вызывать нужно, а CoInitialize - в начале. нечего им делать внутри функции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 16:31 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
Изопропил, в начале работы это где? Проект - это тоже библиотека, давно уже реализованная (не мной) и успешно используемая, но так уж вышло, что надо в эту библиотеку встроить использование этого злополучного COM-объекта. В библиотеке есть функция, с которой должна начинаться работа с этим объектом (тут, я думаю, и должно быть CoInitialize и инициализация объекта) и есть, естественно, функция, которой заканчивается работа с объектом (тут, CoUninitialize). Или я не права? За пределами какой-либо функции CoInitialize ругается. Как объявить? Где инициализировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 17:53 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
Насколько мне изменяет склероз, существует dllMain, которая (с разными параметрами) вызывается в разных ситуациях: загрузка, выгрузка, подключение потока, отключение потока. Если COM-объект используется внутри разделяемой библиотеки, то логично инициализировать объект при загрузке библиотеки, а освободить - при выгрузке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 18:07 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovНасколько мне изменяет склероз, существует dllMain, которая (с разными параметрами) вызывается в разных ситуациях: загрузка, выгрузка, подключение потока, отключение потока. Если COM-объект используется внутри разделяемой библиотеки, то логично инициализировать объект при загрузке библиотеки, а освободить - при выгрузке. логично, но не рекомендуется. https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms678543(v=vs.85).aspx прямой путь - вызывать CoInitialize/CoUninitialize в приложении, а не в dll (всякие vb,vba,vb.net делают это сами) как вариант - в dll иметь процедуры/инициализации завершения, где и вызывать CoInitialize/CoUninitialize. ну и костыли - пытаться создать COM объект, при неудаче вызвать CoInitialize и повторить попытку создания гугл в помощь - "CoInitialize dllmain" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 20:55 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
illsвернее, где объявитьЗависит от архитектуры приложения. Можно, на крайний случай, сделать глобальную переменную. У меня обычно есть класс приложения, в котором хранятся все такие объекты. И ещё вопрос: что за COM-объект? Что требуется в задаче? Может быть, можно обойтись и без него? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2017, 05:08 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
CEMb, обойтись без этого COM-объекта не получится. Основная сложность для меня заключается в том, что с++ сам по себе мне знаком очень поверхностно. Проект, как я уже писала выше, это библиотека, реализующая другой СОМ-объект. Библиотека представляет собой интерфейс с физическим устройством, которое подключается к ПК. Цель - заменить в этой библиотеке работу с одним устройством на работу с устройством того же класса, но от другого производителя. Нужно это для того, чтобы не переписывать прикладное ПО в части работы с внешним устройством. Я хорошо ориентируюсь в структуре самой библиотеки, знаю назначение каждого метода, мне не составляет сложности вписать вызов методов COM-объекта в нужные места, но я не могу никак его объявить и инициализировать так, чтобы было видно во всех необходимых методах. Как я пробовала сделать: 1) сделала #import библиотеки COM-объекта, а после компиляции #include tlh-файла 2) объявила ITheObjectPtr myObj; в том же месте, где описаны переменные в начале файла срр (это ведь глобальная переменная в с++? не нужно никаких служебных слов приписывать?) 3) в методе open(), где должна начинаться работа с COM-объектом, прописала CoInitialize(); myObj(__uuidof(TheObject)); 4) в методе close(), где работа с объектом заканчивается, CoUninitialize(); 5) При компиляции ругается на myObj(__uuidof(TheObject)); вызов объекта типа класса без соответствующей функции operator() или функций преобразования указателя в функцию. 6) перемещала объявление ITheObjectPtr myObj; в h и cpp файл в разные участки кода. Единственный вариант, когда компилируется без ошибок - если объявлять так ITheObjectPtr myObj(__uuidof(TheObject)); но этот вариант проходит только при объявлении внутри какого либо метода. В общем, все вызовы в библиотеке переделаны уже, а проверить не могу, т.к. не могу разобраться с объявлением и инициализацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2017, 15:50 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
illsобъявление ITheObjectPtr myObj; в h и cpp файл в разные участки кода в h надо: Код: plaintext 1. в cpp: Код: plaintext 1. illsmyObj(__uuidof(TheObject)); myObj - это же указатель? (я слаб в COM), сам COM-объект где-то надо создать, например, через CoCreateInstance? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2017, 05:44 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
CEMb, если я правильно поняла, то при таком способе myObj(__uuidof(TheObject)); это и есть создание объекта. В том примере, где я это увидела, сразу после этой строки начиналась работа с объектом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2017, 18:02 |
|
||
|
Как работать с COM-объектом в c++
|
|||
|---|---|---|---|
|
#18+
Друзья, благодарю всех за помощь! Оказалось все очень даже просто: 1) в h-файле импортируем библиотеку с COM-объектом #import "path\MyCOMObj.dll" 2) компилируем проект и получаем файл MyCOMObj.tlh, который подключаем в том же h-файле #include "MyCOMObj.tlh" 3) в h-файле объявляем extern ITheObjectPtr myObj; 4) в cpp-файле ITheObjectPtr myObj(__uuidof(TheObject); Итого в h-файле получаем следующее: Код: plaintext 1. 2. 3. В cpp-файле получаем следующее: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2017, 16:52 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39426822&tid=2018225]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
184ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 293ms |
| total: | 570ms |

| 0 / 0 |
