Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C/C++ Плагин для IE (автоматическое управление браузером) https://www.cyberforum.ru/ c-cpp/ thread1371787.html
мне нужно организовать автоматическое управление браузеров ie (открывать, закрывать вкладки при определённых событиях), вот только незнаю с чего начать, в интернете вычитал что можно это сделать на шарпе, только не могу понять как и примеров не могу найти
Сторонний процесс Excel C/C++
Доброе время суток! Возникла такая задача. Левая программа (не важно какая) запускает Excel с уже сгенерированной информацией. Не открывает файл с диска, а заполняет таблицу "на лету". Мне нужно из своей программы получить данные из этой таблицы и корректно закрыть Excel с сохранением данных из таблицы в файл. VC и .net не предлагайте. Желательно чистый с++ и Qt. Т.е. сам процесс excel я "вижу"...
C/C++ Нумерация страниц в ворде (OLE) Подскажите пожалуйста, как пронумеровать страницы в вордовском документе с помощью технологии OLE? https://www.cyberforum.ru/ c-cpp/ thread1369718.html C/C++ Как получить библиотеку типа *.tlb из COM-объекта *.exe https://www.cyberforum.ru/ c-cpp/ thread1363707.html
Здравствуйте! =) Прошу подсказку у экспертов в COM`е. Можно ли сгенерировать библиотеку типа Tratata.tlb по имеющемуся COM-объекту? Есть подозрение, что есть такая возможность: "...После генерации библиотеки типа Вы можете либо поставлять ее в виде отдельного файла, либо включить ее в Ваш EXE или DLL как ресурс. Большинство разработчиков предпочитает второй вариант, поскольку он...
C/C++ Как узнать подключенные COM порты, их названия и количество
вообщем хочу написать программу, которая будет автоматически находить нужный COM порт по названию устройства и подключаться к нему. нужно узнать список подключенных COM портов и получить их названия. заранее спасибо
C/C++ COM out-of-process (ошибка: Класс не зарегистрирован) https://www.cyberforum.ru/ c-cpp/ thread1347159.html
Здравствуйте, гуру COM`а! Возникла проблема, к которой непонятно с какой стороны подойти... Если кто-нибудь поможет – буду премного благодарна! =) У меня есть программа Prog.exe. Она представляет собой что-то типа БД.
C/C++ Использование ActiveX на диалоге элемента управления MFC Если сделать MFC приложение (based on Dialog) и поместить в диалог ActiveX элемент, то всё работает нормально. Нужно, чтобы этот диалог был в элементе управления MFC и от туда грузился. Если на диалоге нет ActiveX, то всё работает и из элемента управления MFC. Но когда помещаем в диалог ActiveX происходит ошибка. https://www.cyberforum.ru/ c-cpp/ thread1340232.html C/C++ Создание COM объекта
Доброго времени суток! Есть программа на С++, использующая dll для чтения данных с порта RS232, эту программу надо прикрутить к другой через COM объект с использованием JavaScript. com.cpp #include <iostream> #include <locale> #include <conio.h> #include "SerialGate.h"
C/C++ Прозрачность элемента управления ActiveX MFC https://www.cyberforum.ru/ c-cpp/ thread1314011.html
Подскажите, пожалуйста, в чем проблема, уже несколько дней сижу и неполучаеться. Создал элемент управления ActiveX MFC, хочу сделать его прозрачным на форме и не получается у меня. typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags); BOOL Cmy_componentCtrl::OnInitDialog() { lpfnSetLayeredWindowAttributes...
C/C++ AxWindowsMedia Привет всем. Не знаю точно ли выбрал раздел, но мне кажется что, вы мне поможете. В общем добавил я в свой проект как COM-компонент начинку из Windows Media Player, все что мне нужно было сделал, заиграло, хорошо. Вот только когда открыл проект заново: при чём редактор кода не видит никаких ошибок, проект даже компилируется! Не видит компонент только конструктор, как это исправить? Спасибо. https://www.cyberforum.ru/ c-cpp/ thread1307802.html
C/C++ Открыть файл xlsx (2007), обработать информацию и сохранить в аналогичный файл. Какие библиотеки использовать?
Добрый день друзья, суть вопроса такова: мне нужно открыть файл *.xlsx(именно с 2007 офиса), обработать информацию и сохранить уже обработанную информацию в Аналогичный (по структуре) файл. Проблема в том, что я не могу найти нормальной документации по работе с файлами 2007го офиса. Можете ли вы дать ссылки на полезную информацию или разъяснить(если есть желание) что мне делать и как лучше и...
C/C++ Не коннектится к БД https://www.cyberforum.ru/ c-cpp/ thread1299857.html
Нужно считать данные из таблицы Access с помощью ADO. Напоролся на самом подключении к БД, код: #include "stdafx.h" #import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace,rename("EOF", "EndOfFile") #include <oledb.h> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv) {
1 / 1 / 2
Регистрация: 13.02.2015
Сообщений: 19
13.02.2017, 19:22  [ТС] 0

COM & C++ & MDI - C/C++ - Ответ 10109830

13.02.2017, 19:22. Показов 2081. Ответов 7
Метки (Все метки)

Ответ

Всем привет. Поднимаю тему спустя 2 года. Но задачу уже можно "пощупать".

Задача все та же: есть MDI приложение, написанное на MFC+QT, - такой вот гибрид. Система умеет работать с COM. Нужно с помощью отдельных COM-модулей дорабатывать систему. В частности, создавать свой интерфейс на любом языке программирования, поддерживающий COM, и размещать его на клиенте в рабочей области главного окна.

Как работает клиент: при выборе заданного пункта меню, он вызывает наперед известный ему метод интерфейса. Структура интерфейса очень простая:
C++
1
2
3
4
interface ITask : IUnknown {
    HRESULT Run([in]HWND hWndParent,[out]HWND*created_wnd,[out]long*error_code);
 
};
В общем, все понятно: реализовываем данный метод внутри своего модуля, создаем в нем нужный функционал, дочернему окну назначаем родителя и, по идее, все должно работать. Казалось бы, но...

Смоделировал работу клиента и сервера на простеньком примере:

1. COM модуль, который реализует необходимый метод. Метод создает пустое дочернее окно в рабочей области;
2. простое MDI приложение, написанное на MFC, содержит только пункты меню и рабочую область. При выборе пункта меню, вызывается COM модуль.

Клиент:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class CMDIMainFrame : public CMDIFrameWndEx {
    DECLARE_DYNAMIC(CMDIMainFrame)
    public:
        CMDIMainFrame(CWnd *pWnd = 0);
        virtual ~CMDIMainFrame();
 
    protected:
        afx_msg void OnFileNew(); // при данном сообщение вызывается com-модуль
 
        DECLARE_MESSAGE_MAP();
 
};
 
IMPLEMENT_DYNAMIC(CMDIMainFrame, CMDIFrameWndEx)
 
BEGIN_MESSAGE_MAP(CMDIMainFrame, CMDIFrameWndEx)
    ON_COMMAND(ID_FILE_NEW, OnFileNew)
END_MESSAGE_MAP()
 
CMDIMainFrame::CMDIMainFrame(CWnd *pWnd) {}
CMDIMainFrame::~CMDIMainFrame() { }
 
void CMDIMainFrame::OnFileNew() {   
    IClassFactory *factory = 0;
    ITask *iTest = 0;
    HWND hWnd = this->GetSafeHwnd(); // главное окно для передачи модулю
 
    HRESULT h = CoGetClassObject(
        CLSID_TaskClass,
        CLSCTX_INPROC_SERVER,
        NULL,
        IID_IClassFactory,
        reinterpret_cast<void **>(&factory));
 
        HWND created_wnd = 0;
        long error_code = 0;        
 
    h = factory->CreateInstance(NULL, IID_ITask, (void **)&iTest);
    h = iTest->Run(hWnd, &created_wnd, &error_code);
 
    iTest->Release();
    factory->Release();
 
}
Метод в модуле COM
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CChildWnd : public CMDIChildWnd {
    public:
        CChildWnd(){ };
        ~CChildWnd(){ };
};
 
STDMETHODIMP TaskClass::Run( HWND hWndParent, HWND *create_wnd, long *error_code ) { 
    CMDIFrameWnd *pFrameWnd = (CMDIFrameWnd *)CWnd::FromHandle(hWndParent);
    CChildWnd *pChildWnd = new CChildWnd;
    pChildWnd->Create(NULL, _T("Hello"), WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
CFrameWnd::rectDefault, pFrameWnd );
 
        created_wnd = pChildWnd->GetSafeHwnd();
 
    return S_OK; 
}
 
+ фабрика классов, экспортируемые функции и т.д.  - все стандартно.
При вызове пункта меню дочернее окно, созданное в COM-модуле, в самом деле появляется внутри клиента. НО! При закрытии самого клиента возникает ошибка: ACCESS VIOLATION и отладчик указывает на строчку
C++
1
lResult = pWnd->WindowProc(nMsg, wParam, lParam);
файла wincore.cpp.

Запускаю WinDbg. Получаю такую же ошибку в mfc110u!AfxCallWndProc+0x93.
Последнее в стеке вызовов: win32u!NtUserMessageCall+0xc.

Если же перенести код из COM-объекта непосредственно в клиент, то такая ошибка не наблюдается.
Понятно, что ошибка возникает в обработчике событий на клиенте. Но почему? Что нужно сделать на стороне модуля, чтобы корректно "встроиться" в обработчик событий на клиенте? И возможно ли это?

Надеюсь на Вашу помощь, спасибо.

Вернуться к обсуждению:
COM & C++ & MDI C/C++
0
Заказать работу у эксперта
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2017, 19:22
Готовые ответы и решения:

ActiveDirectory & C++
Всем здравствуйте!!! В общем возникла такая задача написать функции для работы с АД 1 функция...

C++ & OpenOffice SDK
Всем привет. Недавно появилась задача из приложения, написанного на языке С++, выгрузки данных в...

IShellLink & IPersistFile - создание ярлыка
Приветствую всех. Написал следующий код : IShellLink* ISH; IPersistFile* IPF;...

Вывод типа, универсальные ссылки, cannot bind lvalue to && и другие
Доброго дня, товарищи. Вот код: Вот отчет компиля: Объясните мне, пожалуйста, где я не прав....

7
13.02.2017, 19:22
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.02.2017, 19:22
Помогаю со студенческими работами здесь

Expression: c <= -1 && c >= 255
Пишу мини курсовую. На ввод принимаются только цифры. И нужна поставить проверку на ввод, то есть...

std::filesystem && std::asio и пр
Пытался найти хоть какие-то сроки включения всего этого в стандарт (так же ожидается lexical_cast,...

Auto&& and decltype(auto)
Приведите пример различия поведения заполнителей auto&amp;&amp; и decltype(auto).

Значение (i&(1<<j)
Вообщем писал такой вот код #include&lt;iostream&gt; #include&lt;math.h&gt; #define n 6 using namespace...

0
Новые блоги и статьи
Как клонировать все ветки (branch) в Git
bytestream 23.01.2025
Система контроля версий Git является ключевым инструментом, позволяющим командам разрабатывать проект в более организованной и упорядоченной форме. Одной из основных концепций Git являются ветки,. . .
Работа со временем в JavaScript. Как получить отметку времени
bytestream 23.01.2025
В JavaScript объект Date представляет собой встроенный инструмент для работы с датами и временем, предоставляющий широкий спектр возможностей для манипуляций с временными данными. При создании нового. . .
Как отменить слияние (merge) в Git
bytestream 23.01.2025
В процессе разработки программного обеспечения часто возникают ситуации, когда необходимо отменить слияние веток в системе контроля версий https:/ / www. cyberforum. ru/ git/ "]Git. Эта операция может. . .
Как узнать какой процесс блокирует файл или каталог в Windows
bt_guru 23.01.2025
При работе с операционной системой Windows пользователи нередко сталкиваются с ситуацией, когда система отказывается выполнять определенные действия с файлами или каталогами, сообщая, что они. . .
Как в curl узнать код статуса HTTP запроса. Коды состояния HTTP
bt_guru 23.01.2025
Коды состояния HTTP играют значимую роль в обеспечении эффективного взаимодействия между клиентами и серверами. При работе с веб-сервисами важно не только отправлять запросы, но и правильно. . .
Как сортировать вывод команды ls в Linux
bt_guru 23.01.2025
В операционной системе Linux команда ls является одним из наиболее часто используемых инструментов для просмотра содержимого директорий. При работе с файловой системой пользователи регулярно. . .
Как сделать POST запрос с помощью curl
bt_guru 23.01.2025
curl - это мощный инструмент командной строки позволяет отправлять и получать данные через различные протоколы, включая HTTP, HTTPS, FTP и множество других. Особенно полезным curl становится при. . .
Прокрутка в tmux с помощью мыши и клавиатуры
bt_guru 23.01.2025
Tmux представляет собой мощный терминальный мультиплексор, который позволяет пользователям создавать и управлять несколькими терминальными сессиями внутри одного окна. Одной из важнейших функций tmux. . .
Как проверить, содержит ли массив значение в JavaScript. Поиск в массиве
bytestream 23.01.2025
Эффективный поиск значений в массивах становится критически важным навыком для разработчиков, использующих JavaScript. Процесс поиска элементов в массиве может показаться простым на первый взгляд,. . .
Как удалить тег Git в удалённом репозитории (remote)
bytestream 23.01.2025
Одним из важнейших механизмов организации версий в Git являются теги, которые позволяют помечать определенные точки в истории проекта как значимые. Теги часто используются для маркировки релизов,. . .
Чем отличаются URL, URI и URN
bytestream 23.01.2025
Системы идентификации представляют собой фундаментальный механизм, позволяющий однозначно определять местоположение и характеристики различных информационных объектов в глобальной сети. Эти системы. . .
Как центрировать div внутри другого div с помощью CSS. Управление расположением элементов в CSS
bytestream 23.01.2025
Позиционирование элементов играет ключевую роль в создании качественных и профессиональных интерфейсов. Одной из наиболее часто встречающихся задач является центрирование элементов на веб-странице,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru