powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как работать с COM-объектом в c++
15 сообщений из 15, страница 1 из 1
Как работать с COM-объектом в c++
    #39425986
ills
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, друзья. Подскажите, пожалуйста, как правильно должна быть организована работа с COM-объектом в с++?

Имеем:
1) зарегистрированный в системе COM-объект стороннего разработчика. Из файлов есть только dll.
2) проект vc++, в который необходимо встроить вызов этого COM-объекта. Работа ведется в Visual Studio 2015.

Раньше работала с COM-объектами в vb, delphi и c#, но там нет никаких сложностей с подключением этого объекта, а в с++ буквально застряла.
Пыталась использовать способ, найденный в интернете (#import dll, CoInitialize(NULL); ITheObjectPtr myObj(__uuidof(TheObject));), но не срастается, да и не покидает чувство, что где-то что-то надо еще добавить, а вот что и куда?

Подскажите, пожалуйста, как? Может быть есть какой-то толковый пример или статья?

Заранее благодарю за помощь!
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39426009
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Учебник

http://www.libex.ru/detail/book58431.html

Вот в VB это отлично упростили.
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39426203
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
illsРабота ведется в Visual Studio 2015.есть директива #import, которая при компиляции генерирует обёртку для указанного COM-объекта.
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39426204
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ills(#import dll, CoInitialize(NULL);опс, мне не по глазам
Ок, а что конкретно не срослось при таком подходе?
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39426470
ills
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMb, не срослось то, что не понятно, как объявить ITheObjectPtr myObj, вернее, где объявить. Мне же надо, чтобы экземпляр объекта в пределах всего проекта был один. Если сделать объявление и инициализацию в пределах процедуры, то все ок, но и работать с объектом можно только в пределах этой процедуры.
Фактически если сделать так, то все хорошо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void myproc()
{
CoInitialize(NULL);                       
 ITheObjectPtr myObj(__uuidof(TheObject)); 
 myObj->SayHello();                        
 myObj = NULL;                          
 CoUninitialize();
}



А если так, то уже не работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ITheObjectPtr myObj;
void myproc()
{
CoInitialize(NULL);                       
 myObj(__uuidof(TheObject)); 
 myObj->SayHello();                        
 myObj = NULL;                          
 CoUninitialize();
}
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39426473
ills
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl, это точно, в vb таких сложностей нет. За книгу спасибо, поищу(на этом сайте ее нет)
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39426653
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ills,

CoUninitialize в конце работы приложения вызывать нужно,
а CoInitialize - в начале.
нечего им делать внутри функции
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39426726
ills
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, в начале работы это где? Проект - это тоже библиотека, давно уже реализованная (не мной) и успешно используемая, но так уж вышло, что надо в эту библиотеку встроить использование этого злополучного COM-объекта. В библиотеке есть функция, с которой должна начинаться работа с этим объектом (тут, я думаю, и должно быть CoInitialize и инициализация объекта) и есть, естественно, функция, которой заканчивается работа с объектом (тут, CoUninitialize). Или я не права? За пределами какой-либо функции CoInitialize ругается. Как объявить? Где инициализировать?
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39426736
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько мне изменяет склероз, существует dllMain, которая (с разными параметрами) вызывается в разных ситуациях: загрузка, выгрузка, подключение потока, отключение потока.
Если COM-объект используется внутри разделяемой библиотеки, то логично инициализировать объект при загрузке библиотеки, а освободить - при выгрузке.
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39426822
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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"
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39427491
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
illsвернее, где объявитьЗависит от архитектуры приложения. Можно, на крайний случай, сделать глобальную переменную. У меня обычно есть класс приложения, в котором хранятся все такие объекты.

И ещё вопрос: что за COM-объект? Что требуется в задаче? Может быть, можно обойтись и без него?
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39427833
ills
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)); но этот вариант проходит только при объявлении внутри какого либо метода.

В общем, все вызовы в библиотеке переделаны уже, а проверить не могу, т.к. не могу разобраться с объявлением и инициализацией.
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39428127
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
illsобъявление ITheObjectPtr myObj; в h и cpp файл в разные участки кода
в h надо:
Код: plaintext
1.
extern ITheObjectPtr myObj;


в cpp:
Код: plaintext
1.
ITheObjectPtr myObj = nullptr;


illsmyObj(__uuidof(TheObject));
myObj - это же указатель? (я слаб в COM), сам COM-объект где-то надо создать, например, через CoCreateInstance?
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39429460
ills
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMb, если я правильно поняла, то при таком способе myObj(__uuidof(TheObject)); это и есть создание объекта. В том примере, где я это увидела, сразу после этой строки начиналась работа с объектом.
...
Рейтинг: 0 / 0
Как работать с COM-объектом в c++
    #39430334
ills
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, благодарю всех за помощь! Оказалось все очень даже просто:
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.
#import "path\MyCOMObj.dll"
#include "MyCOMObj.tlh"
extern ITheObjectPtr myObj;


В cpp-файле получаем следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
ITheObjectPtr myObj(__uuidof(TheObject);

void myproc()
{
myObj->dosomething();
}
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как работать с COM-объектом в c++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]