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

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

11.02.2018, 16:48. Просмотров 835. Ответов 0
Метки нет (Все метки)

Добрый день.

Нужно написать alt com-server и многооконный mfc-client.
По нажатию на кнопку в client открыть новое окно, передать на server "что-то" (xy?), нарисовать круг на server, вывести в client круг.

Мне нужен самый простой пример как это сделать, дальше разберусь...

Вот что я делаю сейчас...

Событие:
C++
1
2
3
4
5
6
7
8
9
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: добавьте свой код обработчика сообщений или вызов стандартного
 
    IMyCirclePtr pMyCircle(__uuidof(IMyCircle));
    pMyCircle->Add(point.x, point.y);
 
    CWnd::OnLButtonDown(nFlags, point);
}
Метод:
C++
1
2
3
4
5
6
7
STDMETHODIMP CMyCircle::Add(LONG x, LONG y)
{
    // TODO: добавьте код реализации
    MyPoint.x = x;
    MyPoint.y = y;
    return S_OK;
}
Рисуем:
C++
1
2
3
4
5
6
7
8
9
10
HRESULT OnDraw(ATL_DRAWINFO& di)
    {
        RECT& rc = *(RECT*)di.prcBounds;
        HDC hdc = di.hdcDraw;
 
        CalcPoints(rc);
        Polygon(hdc, &m_arrPoint[0], m_nSides);
 
        return S_OK;
    }
Считаем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void CMyCircle::CalcPoints(const RECT& rc)
{
    const double pi = 3.14159265358979;
    // POINT ptCenter;
    double dblRadiusx = (rc.right - rc.left) / 2;
    double dblRadiusy = (rc.bottom - rc.top) / 2;
    double dblAngle = 3 * pi / 2;          // начинаем сверху
    double dblDiff = 2 * pi / m_nSides;   // угол на каждую сторону
    MyPoint.x = (rc.left + rc.right) / 2;
    MyPoint.y = (rc.top + rc.bottom) / 2;
 
    // вычисляем точки для каждой стороны
    for (int i = 0; i < m_nSides; i++)
    {
        m_arrPoint[i].x = (long)(dblRadiusx * cos(dblAngle) + MyPoint.x + 0.5);
        m_arrPoint[i].y = (long)(dblRadiusy * sin(dblAngle) + MyPoint.y + 0.5);
        dblAngle += dblDiff;
    }
}
И это не работает, pMyCircle пишет что "__vfptr <Чтение памяти невозможно> void * *"

Лог:
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxtoolbarimages.cpp(970) : atlTraceGeneral - Can't load bitmap: WINDOWS7_IDB_RIBBON_BTN_PANEL_MAIN. GetLastError() = 716
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winfrm.cpp(1628) : AppMsg - Warning: no message line prompt for ID 0x0000.
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winmdi.cpp(596) : AppMsg - Warning: no shared menu/acceltable for MDI Child window.
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winmdi.cpp(872) : AppMsg - Warning: GetWindowMenuPopup failed!
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winmdi.cpp(872) : AppMsg - Warning: GetWindowMenuPopup failed!
Вызвано исключение по адресу 0x76CA08B2 в MfcClient.exe: исключение Microsoft C++: _com_error по адресу памяти 0x003EF208.
Возникло необработанное исключение по адресу 0x76CA08B2 в MfcClient.exe: исключение Microsoft C++: _com_error по адресу памяти 0x003EF208.
Добавлено через 23 минуты
Нашел ошибку, надо было указатель на class MyCircle, а у меня на struct IMyCircle
C++
1
2
3
4
5
6
7
8
9
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: добавьте свой код обработчика сообщений или вызов стандартного
 
    IMyCirclePtr pMyCircle(__uuidof(MyCircle));
    pMyCircle->Add(point.x, point.y);
 
    CWnd::OnLButtonDown(nFlags, point);
}
Но пока что не рисует...

Добавлено через 19 часов 10 минут
Всё, я разобрался!

Вот такой метод возвращает рисунок:
C++
1
2
3
4
5
6
7
8
9
10
11
STDMETHODIMP CMySquare::Add(RECT rc, HDC hdc, LONG radius, LONG x, LONG y)
{
    // TODO: добавьте код реализации
    MyPoint.x = x;
    MyPoint.y = y;
    MyRadius = radius;
 
    OnDraw(rc, hdc);
 
    return S_OK;
}
Может что то и не правильно, но работает.
1
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2018, 16:48
Ответы с готовыми решениями:

Изучение COM, C++ ATL
Добрый день. Ищу самый простой материал по изучению технологии COM. Нужно создать COM полигон и...

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

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

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

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

0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2018, 16:48

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

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

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


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

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

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