Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: COM, OLE, ActiveX
Войти
Регистрация
Восстановить пароль
 
Leningradeс
13 / 13 / 3
Регистрация: 03.03.2011
Сообщений: 365
#1

Изучение COM, C++ ATL - C++ COM

28.01.2018, 22:47. Просмотров 407. Ответов 10
Метки нет (Все метки)

Добрый день.
Ищу самый простой материал по изучению технологии COM.
Нужно создать COM полигон и вывести его в MFC окно.
Везде очень старый или практически не понятный материал. Хотелось бы на пальцах понять как это работает.
http://www.cyberforum.ru/com-ole/thread709190.html
Заранее благодарю!

Добавлено через 22 часа 27 минут
Нашел одно интересное пособие и собственно получилось сделать калькулятор.
При билде x86 всё замечательно работает, а при билде x64 выбивает ошибку.
Возникло необработанное исключение по адресу 0x00007FF8FBA93FB8 в AtlClientApp.exe: исключение Microsoft C++: _com_error по адресу памяти 0x00000090E7CFFB80.
Добавлено через 9 минут
Вот код отладки...
Кликните здесь для просмотра всего текста
"AtlClientApp.exe" (Win32). Загружено "E:\project\AtlGettingStarted\x64\Release\AtlClientApp.exe". Символы загружены.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\ntdll.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\kernel32.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\KernelBase.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\ole32.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\combase.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\ucrtbase.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\rpcrt4.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\bcryptprimitives.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\gdi32.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\gdi32full.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\msvcp_win.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\user32.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\win32u.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\sechost.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\oleaut32.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\vcruntime140.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\msvcp140.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\imm32.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\kernel.appcore.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\msvcrt.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\uxtheme.dll". Невозможно найти или открыть PDB-файл.
"AtlClientApp.exe" (Win32). Загружено "C:\Windows\System32\clbcatq.dll". Невозможно найти или открыть PDB-файл.
Вызвано исключение по адресу 0x00007FF8FBA93FB8 в AtlClientApp.exe: исключение Microsoft C++: _com_error по адресу памяти 0x00000090E7CFFB80.
Возникло необработанное исключение по адресу 0x00007FF8FBA93FB8 в AtlClientApp.exe: исключение Microsoft C++: _com_error по адресу памяти 0x00000090E7CFFB80.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

AtlClientApp.exe вызвал срабатывание точки останова.

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Необработанное исключение по адресу 0x00007FF74F761AD4 в AtlClientApp.exe: Код инcтрументирования объектов cookie стека обнаружил переполнение буфера, связанное со стеком..

Программа "[16296] AtlClientApp.exe" завершилась с кодом 0 (0x0).


Добавлено через 5 часов 30 минут
Так и не разобрался как сделать например круг на COM сервере и вывести его в PicBox MFC.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2018, 22:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Изучение COM, C++ ATL (C++ COM):

Использование созданных ATL контроллеров
Я извиняюсь, может кто помочь, потому что первый раз самому тяжело разобраться,...

поделитесь ATL
Доброго времени суток! Может у кого завалялась библиотека atl, будьте добры,...

Литература по ATL/WTL.
Здравствуйте, уважаемые форумчане! Не могли бы вы посоветовать стоящую...

Ошибка COM (Excel) без использования MFC, ATL
Доброго времени суток! Я занимаюсь разработкой приложения, которое выгружает...

Как работать с ATL OLE DB Consumer wizard?
Здраствуйте! Я на форуме первый раз. Я пишу простенькую програму на MFC доступ...

10
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
29.01.2018, 08:07 #2
Leningradeс, если объект 32 то и сервер должен быть 32. То же самое про 64
1
Leningradeс
13 / 13 / 3
Регистрация: 03.03.2011
Сообщений: 365
29.01.2018, 08:55  [ТС] #3
Цитата Сообщение от vxg Посмотреть сообщение
Leningradeс, если объект 32 то и сервер должен быть 32. То же самое про 64
Я так и понял, спасибо.

а на счет создания графических объектов не поможете?
нужен класс poligon например, и например 3 метода которые создают треугольник квадрат круг по запросу с клиента оконного MFC.

мне код не нужен, а вот общее объяснение как это сделать, какие типы методов использовать.
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
29.01.2018, 19:06 #4
Leningradeс,
1 что значит создают? рисуют в предоставленное окно?
2 берём придумываем интерфейс правильный многоугольник с методом нарисовать с аргументами окно, координаты центра, радиус описанной окружности и количество углов
3 пишем для него h и IDL файлы, при помощи MIDL генерируем TLB файл
4 пишем реализацию интерфейса способную сделать то что мы задумали
5 не забываем о том что нам нужны фабрика и функции регистрации / разрегистрации
6 в клиентской программе создаём объект, запрашиваем интерфейс, вызываем его метод
PS конечно перед запуском клиентской программы объект должен быть зарегистрирован в системе
Пример можно посмотреть тут http://www.cyberforum.ru/com-ole/thread663368.html#post3538077
Некоторые инструменты IDE или библиотеки вроде ATL могут сделать часть работы за вас, в примере они не рассматриваются - это максимально близкий к собственно COM пример
0
Leningradeс
13 / 13 / 3
Регистрация: 03.03.2011
Сообщений: 365
29.01.2018, 21:58  [ТС] #5
Цитата Сообщение от vxg Посмотреть сообщение
Leningradeс,
1 что значит создают? рисуют в предоставленное окно?
2 ...
Да у меня зарегистрирована DLL с ActiveX объектом
На сейчас у меня COM сервер есть и там рисуется ActiveX многоугольник с Методами
C++
1
2
STDMETHODIMP CPoligon::put_Sides(SHORT newVal)
STDMETHODIMP CPoligon::get_Sides(SHORT* pVal)
Создал MFC окно и туда поместил Кнопку и PictureControl, хочу несколько раз вывести свой многоугольник в PictureControl
C++
1
2
3
4
5
void CAtlMfcClientDlg::OnBnClickedButtonstart()
{
    // TODO: добавьте свой код обработчика уведомлений
    // PictureControl
}
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
30.01.2018, 07:55 #6
Leningradeс, и что?
0
Leningradeс
13 / 13 / 3
Регистрация: 03.03.2011
Сообщений: 365
30.01.2018, 08:15  [ТС] #7
То есть пока что у меня очень маленькая реализация COM объекта, тестировал в "ActiveX Control Test Container", надо создать некий метод для передачи нарисованного объекта в MFC клиент.
Когда я делал калькулятор, там была просто передача указателя на результат сложения и других операций.
AtlClient.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include "objbase.h"
#include <iostream>
 
#import "AtlServerLib.tlb" no_namespace named_guids
 
 
int main()
{
    CoInitialize(NULL);
 
    {
        ICalculatorPtr pCalculator(__uuidof(Calculator));
 
        std::cout << "1 + 2 = " << pCalculator->Add(1, 2) << std::endl;
        std::cout << "1 + ... + 10 = " << pCalculator->Sum(1, 10) << std::endl;
    }
 
    CoUninitialize();
 
    return 0;
}
Calculator.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Calculator.cpp: реализация CCalculator
 
#include "stdafx.h"
#include "Calculator.h"
 
 
// CCalculator
 
 
 
STDMETHODIMP CCalculator::Add(LONG x, LONG y, LONG* rlt)
{
    // TODO: добавьте код реализации
 
    *rlt = x + y;
 
    return S_OK;
}
 
 
STDMETHODIMP CCalculator::Sum(LONG a, LONG z, LONG* rlt)
{
    // TODO: добавьте код реализации
 
    *rlt = 0;
    for (LONG i = 0; i <= z; ++i) *rlt += i;
 
    return S_OK;
}
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
30.01.2018, 08:22 #8
Leningradeс, сделайте на стороне сервера объект канва который может рисовать на стороне сервера и передайте его в объект многоугольника - пусть он сам себя нарисует на сервере
0
Leningradeс
13 / 13 / 3
Регистрация: 03.03.2011
Сообщений: 365
30.01.2018, 21:22  [ТС] #9
Я создал объект ActiveX, он строит многоугольник, но у меня не получается вывести с помощью С++ в окно MFC.
Вот есть кнопка...
C++
1
2
3
4
void CAtlMfcClientDlg::OnBnClickedButtonstart()
{
    // TODO: добавьте свой код обработчика уведомлений
}
Можете написать какой нибудь пример?
0
vxg
Модератор
3229 / 2032 / 319
Регистрация: 13.01.2012
Сообщений: 7,884
31.01.2018, 07:57 #10
Leningradeс, https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx
1
Leningradeс
13 / 13 / 3
Регистрация: 03.03.2011
Сообщений: 365
31.01.2018, 09:54  [ТС] #11
vxd, я эту функцию и использую я разобрался как решить мою задачу, спасибо за все подсказки!

У меня осталась небольшая проблема с математикой, но думаю разберусь.
1
31.01.2018, 09:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2018, 09:54
Привет! Вот еще темы с решениями:

Где скачать в электронном виде "ATL 8. Внутренняя структура и применение"
Кто может помочь найти где скачать в электронном виде &quot;ATL 8. Внутренняя...

Изучение С++
Добрый день! Вот решил взяться за изучение С++. И возникли вопросы: - какая...

Дальнейшее изучение
Доброго времени суток! Последнее время мучает такой вопрос: что изучать...

Изучение C++ после Java
Господа знатоки C++, нужна ваша помощь в выборе плана самообразования. Дело...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru