14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день.
Ищу самый простой материал по изучению технологии COM.
Нужно создать COM полигон и вывести его в MFC окно.
Везде очень старый или практически не понятный материал. Хотелось бы на пальцах понять как это работает.
Заранее благодарю!

Добавлено через 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2018, 22:47
Ответы с готовыми решениями:

ATL
Здравствуйте, не подскажете если ли туториалы на русском по этой библиотеке? Нужно написать...

Win32 + ATL
Мне нужна помощь с работой в атл. вот код: #include <windows.h> #include <atlbase.h>...

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

На зачете спросили по ATL COM
С помощью мастера ATL COM в Visual Studio на языке C++ создаем проект LB3_AutoSvr в качестве...

10
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
29.01.2018, 08:07 2
Leningradeс, если объект 32 то и сервер должен быть 32. То же самое про 64
1
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
29.01.2018, 08:55  [ТС] 3
Цитата Сообщение от vxg Посмотреть сообщение
Leningradeс, если объект 32 то и сервер должен быть 32. То же самое про 64
Я так и понял, спасибо.

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

мне код не нужен, а вот общее объяснение как это сделать, какие типы методов использовать.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
29.01.2018, 19:06 4
Leningradeс,
1 что значит создают? рисуют в предоставленное окно?
2 берём придумываем интерфейс правильный многоугольник с методом нарисовать с аргументами окно, координаты центра, радиус описанной окружности и количество углов
3 пишем для него h и IDL файлы, при помощи MIDL генерируем TLB файл
4 пишем реализацию интерфейса способную сделать то что мы задумали
5 не забываем о том что нам нужны фабрика и функции регистрации / разрегистрации
6 в клиентской программе создаём объект, запрашиваем интерфейс, вызываем его метод
PS конечно перед запуском клиентской программы объект должен быть зарегистрирован в системе
Пример можно посмотреть тут https://www.cyberforum.ru/com-... ost3538077
Некоторые инструменты IDE или библиотеки вроде ATL могут сделать часть работы за вас, в примере они не рассматриваются - это максимально близкий к собственно COM пример
0
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
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
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
30.01.2018, 07:55 6
Leningradeс, и что?
0
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
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
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
30.01.2018, 08:22 8
Leningradeс, сделайте на стороне сервера объект канва который может рисовать на стороне сервера и передайте его в объект многоугольника - пусть он сам себя нарисует на сервере
0
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
30.01.2018, 21:22  [ТС] 9
Я создал объект ActiveX, он строит многоугольник, но у меня не получается вывести с помощью С++ в окно MFC.
Вот есть кнопка...
C++
1
2
3
4
void CAtlMfcClientDlg::OnBnClickedButtonstart()
{
    // TODO: добавьте свой код обработчика уведомлений
}
Можете написать какой нибудь пример?
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
31.01.2018, 07:57 10
Leningradeс, https://msdn.microsoft.com/ru-... s.85).aspx
1
14 / 14 / 3
Регистрация: 03.03.2011
Сообщений: 435
31.01.2018, 09:54  [ТС] 11
vxd, я эту функцию и использую я разобрался как решить мою задачу, спасибо за все подсказки!

У меня осталась небольшая проблема с математикой, но думаю разберусь.
1
31.01.2018, 09:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2018, 09:54
Помогаю со студенческими работами здесь

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

ATL Service и переодическая задача
Необходимо написать сервис для вин, использую для этой цели шаблон в VS2010(С++, АТЛ)....

Создание коллекции с использованием ATL!
Здравствуйте столкнулся с такой проблемой: Создал я СОМ сервер на с++ и клиент на VB вроде все...

Регистрация ActiveX (.NET , ATL)
Решился перейти от BCB к VC и, ессно, столктулся с проблемами ... Проблема 1 (насущная). Создаю в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru