Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C/C++ Обновление содержимого OLE-контейнера Всем добрый день! Прошу о помощи с OLE-контейнером. В контейнер помещаю документ из Маткада с графиком изначально пустым (график задается из текстового файла), затем данные обновляются в текстовом документе, но при прорисовке OleContainer все так же отображает пустой график. Пока не кликнуть мышью по контейнеру, он не измениться. Можно ли как-то это исправить? Пыталась использовать... https://www.cyberforum.ru/ c-cpp/ thread2810064.html Регистрация СОМа C/C++
Доброе время суток. Прошу не судить строго, я только начинаю знакомится с COM. С помощью ресурсов Введение в СОМ и CodeProject написал компонент. Зарегистрировал его reg-файлом: (конечно под админом) REGEDIT HKEY_CLASSES_ROOT\EATHMODEL.Component.v001 = Earth potential model HKEY_CLASSES_ROOT\EATHMODEL.Component.v001\CurVer = EATHMODEL.Component.v001...
C/C++ Разработка ActiveX клиентов https://www.cyberforum.ru/ c-cpp/ thread2805619.html
Кто-нибудь может описать особенности и в целом про разработки ActiveX клиентов в разных средах: .NET, C++, Delphi, Python? Заранее спасибо
C/C++ Название интерфейса У меня переопределен класс т.е. типа хука, и мой класс вызывает QueryInterface вместо оригинального QueryInterface, и ведет лог. QueryInterface_DDRAW2-{6AAE1EC1-662A-11D0-889D-00AA00BBB76A} HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObj) { LPWSTR pwsz; StringFromIID( riid, &pwsz ); https://www.cyberforum.ru/ c-cpp/ thread2802876.html
C/C++ Достать элемент из Variant массива из одного элемента
Здравствуйте, Поля дня бьюсь не могу понять: У меня есть Вариантный массив из одного элемента: VARIANT arr; arr.vt = VT_ARRAY | VT_VARIANT; {
C/C++ C++ builder и MathCAD Всем привет! Подскажите, пожалуйста, новичку, как получить доступ через C++ builder к MathCAD, его графикам и данным? Необходимо на форме отображать графики из Маткада. Данные переменных из Маткада отправить в другое приложение либо выгрузить в txt файл. https://www.cyberforum.ru/ c-cpp/ thread2778334.html
C/C++ StartMenu rectangle Нужно взять хендл на StartMenu Windows10. Или хотябы получить ректангл отонсительно экрана. https://www.cyberforum.ru/ c-cpp/ thread2714262.html Где найти заголовки <afxodlgs.h>? C/C++
Добрый день. Хочу добавить системный диалог "Вставить объект". Нашел в MSDN описание класса COleInsertDialog. Однако требуется заголовок <afxodlgs.h>. Перерыл все, не нашел. Кто располагает информацией подскажите где может быть, на каких ресурсах найти (.h .lib .dll) afxodlgs.h. И если кто хочет может скинуть исходники реализации вызова данного диалога и работой с Microsoft Equantion. Заранее...
C/C++ SafeArrayGetElement - вызывает утечку памяти Здравствуйте, Подскажите пожалуйста, не могу понять, куда исчезает память: int main() { for(int i=0; i<1000; i++) { https://www.cyberforum.ru/ c-cpp/ thread2708394.html C/C++ Что делает CoLockObjectExternal? https://www.cyberforum.ru/ c-cpp/ thread2696637.html
На MSDN описание совершенно непонятное. А Don Box вообще описывает это совершенно по-другому(и тоже непонятно). Опираясь на описание из MSDN, я не понимаю, чем это отличается от AddRef. А уж тем более, как эта функция может каким-то волшебным образом "залочить" объект. Добавлено через 1 час 14 минут Если используете у себя эту функцию, прошу поделиться, для чего используете. Очень...
Как выгрузить ранее заинжекченную длл? C/C++
Использую дефолтный метод инжекта - LL. Так как эту дллку видно через process hacker, мне надо сделать так, чтобы можно было выгрузить эту дллку в случае необходимости. Код инжекта ниже wHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId); LoadLibraryAdd = (LPVOID)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA"); RND = (LPVOID)VirtualAllocEx(wHandle, NULL,...
C/C++ Как открыть файл Excel (sdkxll)? Добрый день. Может ли кто подсказать как открыть файл Excel при помощи функций Microsoft sdk xll? https://www.cyberforum.ru/ c-cpp/ thread2693194.html
8 / 3 / 1
Регистрация: 11.08.2016
Сообщений: 46
0

Простой пример создания COM компонента - C/C++ - Ответ 15420342

15.04.2021, 09:59. Показов 20056. Ответов 8
Метки (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! В универе по системному программированию дали лабу: написать либу с COM-компонентом и программу, которая бы ее использовала. Не могу никак разобраться, как грамотно, нормально написать простой COM-компонент. В теории я вроде бы разобрался, но на практике ничего не выходит.
На MSDN я нашел пример "простого" COM-компонента с использованием WinRT (https://docs.microsoft.com/ru-... -coclasses), но из того кода я ничего не понял - мои знания C++ на уровне "Си + ООП от C#". Нагуглив несколько старых статей в интернете...
1) https://www.rsdn.org/article/com/introcom.xml
2) http://www.comprice.ru/article... p?ID=42510
...я сумел кое-что написать (библиотеку) и это даже скомпилилось) А вот клиент не компилится. XD Но проблема еще и в том, что я не могу понять, как теперь эту библиотеку использовать: .lib-файл не создается (т.к., насколько я понимаю, нет ни одной переменной, которая бы содержала __declspec(dllexport) ). Объясните, пожалуйста, как решить эту проблему, где у меня ошибки. На данный момент я в тупике, ощущение, что сделал неправильно все, что можно было) XD Но хочу разобраться.

Когда .lib-файл не создался, я попробовал добавить DllExport везде, где можно, но само собой это не сработало)

БИБЛИОТЕКА
framework.h - тут ничего интересного, но все же скину для полноты картины
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
#pragma once
 
#define WIN32_LEAN_AND_MEAN             // Исключите редко используемые компоненты из заголовков Windows
// Файлы заголовков Windows
#include <windows.h>
#include <objbase.h>
 
#define DllExport __declspec(dllexport)

CA.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
#include "pch.h"
#include "IX.h"
#include "IY.h"
 
DllExport class CA : public IX, public IY
{
    // Реализация методов IUnknown
    DllExport virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);
    DllExport virtual ULONG __stdcall AddRef();
    DllExport virtual ULONG __stdcall Release();
    // Реализация интерфейса IX
    DllExport virtual void __stdcall Fx();
    // Реализация интерфейса IY
    DllExport virtual void __stdcall Fy();
};

IX.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
 
// {23F01AC6-8D3E-4BCD-A33A-4AB364425FEA}
static const GUID IID_IX =
{ 0x23f01ac6, 0x8d3e, 0x4bcd, { 0xa3, 0x3a, 0x4a, 0xb3, 0x64, 0x42, 0x5f, 0xea } };
 
DllExport class IX : IUnknown
{
    DllExport virtual void __stdcall Fx() = 0;
};

IY.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
 
// {86E45419-5366-4BBD-9C45-59DE61E432C9}
static const GUID IID_IY =
{ 0x86e45419, 0x5366, 0x4bbd, { 0x9c, 0x45, 0x59, 0xde, 0x61, 0xe4, 0x32, 0xc9 } };
 
interface IY : IUnknown
{
    virtual void __stdcall Fy() = 0;
};

CA.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "pch.h"
#include "CA.h"
#include <iostream>
 
// класс СОМ-объекта
 
// Реализация методов IUnknown
DllExport ULONG __stdcall CA::AddRef() { return 0; }; // пока ничего не делает
DllExport ULONG __stdcall CA::Release() { return 0; }; // пока ничего не делает
// Реализация интерфейса IX
DllExport void __stdcall CA::Fx() { printf("Fx\n"); }
// Реализация интерфейса IY
DllExport void __stdcall CA::Fy() { printf("Fy\n"); }

Еще есть pch.h и pch.cpp, но их показывать нет смысла.

КЛИЕНТ
В клиенте VS жалуется на строки 16, 30 и 43. Этот пример я взял из интернета.
Кликните здесь для просмотра всего текста
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
45
46
47
48
49
50
51
52
53
54
55
#define _CRT_SECURE_NO_WARNINGS
 
#include "CA.h"
#include "IX.h"
#include "IY.h"
 
#include <iostream>
 
IUnknown* CreateInstance()
{
    IUnknown* pI = (IX*)new CA;
    pI->AddRef();
    return pI;
}
void main()
{
    HRESULT hr;
    // Создание объекта
    IUnknown* pIUnknown = CreateInstance();
    IX* pIX = NULL;
    // Получить интерфейс IX
    hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIX);
    if (SUCCEEDED(hr))
    { // вызвать метод Fx
        pIX->Fx();
    }
    else printf("Объект не имеет интерфейса \n");
    IY* pIY = NULL;
    // Получить интерфейс IY
    hr = pIUnknown->QueryInterface(IID_IY, (void**)&pIY);
    if (SUCCEEDED(hr))
    { // вызвать метод Fy
        pIY->Fy();
    }
    else printf("Объект не имеет интерфейса \n");
    // Получить интерфейс IY через интерфейс IX
    IY* pIY_IX = NULL;
    hr = pIX->QueryInterface(IID_IY, (void**)&pIY_IX);
    if (SUCCEEDED(hr))
    { // вызвать метод Fy
        pIY_IX->Fy();
    }
    else printf("Объект не имеет интерфейса \n");
    // Получить интерфейс IUnknown через интерфейс IY
    IUnknown* pIUnknown_IY = NULL;
    hr = pIY->QueryInterface(IID_IUnknown, (void**)&pIUnknown_IY);
    if (SUCCEEDED(hr))
        if (pIUnknown_IY == pIUnknown)
        {
            printf("указатели совпадают \n");
        }
        else printf("указатели не совпадают \n");
    // Удалить объект
    delete pIUnknown;
}

Надеюсь, кто-нибудь сможет грамотно объяснить, как это работает и как все соединить. Заранее спасибо!

Вернуться к обсуждению:
Простой пример создания COM компонента C/C++
0
Заказать работу у эксперта
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2021, 09:59
Готовые ответы и решения:

простой пример использования компонента TrackBar
люди, здравствуйте! помогите плиз с вопросом! мне нужно к курсовому прикрепить немного теории и...

Простой пример создания нового потока с интерфейсом Runnable
public class theThread implements Runnable{ Thread t; theThread(){ t = new Thread(this,...

Привидите простой пример создания Dll файла, но чтобы в самом Dll находился файл.
Пожалуйста привидите простой пример создания Dll файла, но чтобы в самом Dll находился файл (к...

Простой вариант дублирования компонента
К примеру - есть панель с компонентами и со свойством Visible:=false; (Используем эту панель как...

8
15.04.2021, 09:59
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2021, 09:59
Помогаю со студенческими работами здесь

Пример внешенего компонента на Delphi
У кого есть или поделитесь литературой

Момент создания компонента
на форме лежит TreeView и pageControl. на странице в педжконтроле в свойстве Onshow вот такой код -...

Ошибка создания компонента
На форму кидаю любой компонент и вылетает вот такая ошибка, может кто знает как с ней бороться?

Проблема создания компонента
Создаю новый UserControl, помещаю на него ComboBox и через мастер компонентов, наследую новому...

Простой пример
Доброе время суток! Вот написал на html-е пример меню. Можете помочь через JQ сделать эффект...

Простой пример на С++
a - типа int задаем

0
Новые блоги и статьи
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
Как изменить адрес удалённого репозитория (origin) в Git
InfoMaster 20.01.2025
В терминологии Git термин origin является стандартным именем для основного удаленного репозитория, с которым взаимодействует локальная копия проекта. Когда разработчик клонирует репозиторий с. . .
Как переместить последние коммиты в новую ветку (branch) в Git
InfoMaster 20.01.2025
При работе над проектом часто возникают ситуации, когда необходимо изолировать определенные изменения от основной линии разработки. Это может быть связано с экспериментальными функциями, исправлением. . .
Как вернуть результат из асинхронной функции в JavaScript
InfoMaster 20.01.2025
Асинхронное программирование представляет собой фундаментальную концепцию в JavaScript, которая позволяет выполнять длительные операции без блокировки основного потока выполнения программы. В. . .
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетов началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые прототипы,. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
Как без исключения проверить существование файла в Python
InfoMaster 19.01.2025
При разработке программного обеспечения на Python часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru