Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/62: Рейтинг темы: голосов - 62, средняя оценка - 4.95
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633

OLE(Object Linking and Embedding)?

24.01.2024, 23:07. Показов 14662. Ответов 167

Студворк — интернет-сервис помощи студентам
Здравствуйте! Приступил к изучению темы OLE, если кто-то эту тему понимает, то ему не составит труда пояснить что это за зверь такой, ну, или пояснить некоторые моменты, мелочи. Вот одна такая "мелочь"
Почему автор объявляет класс так:
Кликните здесь для просмотра всего текста
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
#ifndef IMALLOC_H
#define IMALLOC_H
 
/*==================================================================
    IMALLOC.H
    C Interface to private allocator
======================================================================*/
#define EXPORT extern "C" __declspec(dllexport)
 
EXPORT LPMALLOC CreateAllocator();
 
//----------------------------------------------
//Implementation of allocator interface
//------------------------------------------------------------------------
#undef INTERFACE 
#define INTERFACE DAlloc 
 
DECLARE_INTERFACE_(DAlloc, IMalloc)
{
    // *** IUnknown methods ***
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppv);
    STDMETHOD_(ULONG, AddRef)(THIS);
    STDMETHOD_(ULONG, Release)(THIS);
 
    // *** IMalloc methods ***
    STDMETHOD_(void*, Alloc)(THIS_ ULONG cb);
    STDMETHOD_(void*, Realloc)(THIS_ void* pv, ULONG cb);
    STDMETHOD_(void, Free)(THIS_ void* pv);
    STDMETHOD_(size_t, GetSize)(THIS_ void* pv);
    STDMETHOD_(int, DidAlloc)(THIS_ void* pv);
    STDMETHOD_(void, HeapMinimize)(THIS);
 
#ifndef CINTERFACE 
public:
    DAlloc();
    ~DAlloc();
    BOOL Initialize();
 
private:
    ULONG RefCount;
    HANDLE hHeap;
#endif
 
};
 
 
#endif

Это что-то абсолютно мне не знакомое, и, если на win32 DLL-библиотека собирается, то для win64 уже нет, ругается
Code
1
2
3
4
5
imalloc.cpp(15): error C2259: "DAlloc": невозможно создать экземпляр абстрактного класса
imalloc.h(19): message : см. объявление "DAlloc"
imalloc.cpp(15): message : из-за следующих членов:
imalloc.cpp(15): message : void *IMalloc::Alloc(SIZE_T): абстрактный
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\objidlbase.h(1151): message : см. объявление "IMalloc::Alloc"
Но почему эти ошибки не касаются win32 библиотеки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2024, 23:07
Ответы с готовыми решениями:

Error linking glsl Program Object
Здравствуйте уважаемые гуру. Устроился на работу, дали проект, проект компилится, собирается но проблемма такая: на некоторых компьютерах...

Как увидеть содержание типа OLE Object с помощью Delphi-Ole Conteiner?
Привет всем, я из Болгарии у меня такой вопрос: я работю с MSAccess и в ней есть Table и Field с содержанием типа OLE Object. как я...

Изменить Свойство Ole Object
Добрый день. Ткните носом кто-нибудь плз., как программно поменять свойство Display As вставленного в Rich Text поля OLE Object-а типа...

167
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
13.02.2024, 05:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Liss29 Посмотреть сообщение
Файл DAlloc не может найти
У вас есть такой файл? Прямо вот так *.h, без *.cpp без расширения? Полный текст ошибки приведите пожалуйста.

Цитата Сообщение от Liss29 Посмотреть сообщение
Я цитаты кому выкладывал... я же их не сам придумал, к сожалению!
Спутали интерфейс и «интерфейсную часть»? Смотрите сами:
C++
1
2
interface ISample{
}
Code
1
2
3
client.cpp:1:1: error: 'interface' does not name a type
    1 | interface ISample{
      | ^~~~~~~~~
В С++ нет интерфейсов, они эмулируются через абстрактные классы.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
13.02.2024, 06:03
Цитата Сообщение от Liss29 Посмотреть сообщение
Caller1 без DAlloc.h собираться не хочет
Вы заменили в Caller1.cpp
C++
12
#include "DAlloc.h"
на объявление функции ?
C++
12
13
extern "C" 
LPMALLOC CreateAllocator();
Миниатюры
OLE(Object Linking and Embedding)?  
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
13.02.2024, 17:33  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
без расширения?
Конечно, с расширением. Я же выложил все файлы которые у меня есть, что ещё нужно, уберите из этих файлов DDAlloc и останется то, что есть сейчас.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Спутали интерфейс и «интерфейсную часть»? Смотрите сами:
Это игра слов, формулировок я выше привёл то, что говорится в книге по С++ и то, что в этих книгах не говорится об объявлении класса, как
C++
1
2
interface ISample{
}
ещё ничего не значит, так что это пустой спор.

Цитата Сообщение от politoto Посмотреть сообщение
Вы заменили в Caller1.cpp
Нет, в DAlloc добавилось объявление
C++
1
2
#define EXPORT extern "C" __declspec(dllexport)
EXPORT LPMALLOC CreateAllocator(void);
и всё. В Caller1 подключается библиотека DAlloc.h вместо DDAlloc.h. Если нужно могу снова выложить весь проект, но там изменений не так уж и много, лишь те, что я перечислил.
CALLER1.rar
IMALLOC1.rar
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
13.02.2024, 17:55
Цитата Сообщение от Liss29 Посмотреть сообщение
подключается библиотека DAlloc.h
Не называйте заголовочный файл библиотекой.
Цитата Сообщение от Liss29 Посмотреть сообщение
CALLER1.rar
Ваш Dalloc.h для клиента должен быть таким:
C++
1
2
3
4
5
6
7
8
9
#pragma once
#ifndef DALLOC_H
#define DALLOC_H
 
#include<windows.h>
 
extern "C" LPMALLOC CreateAllocator(void);
 
#endif
Удалите оттуда всё лишнее.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
13.02.2024, 22:00  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Удалите оттуда всё лишнее.
Сделал. Думаю, теперь всё так как должно быть.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
14.02.2024, 09:06
Цитата Сообщение от Liss29 Посмотреть сообщение
всё так как должно быть.
Зачем тип возвращаемое значение поменяли у DAlloc::AddRef() и DAlloc::Release() c ULONG на SIZE_T?
Конечно, оно редко используется, а c++ позволяет это делать, но зачем?
C++
46
47
    STDMETHODIMP_(SIZE_T) AddRef() override { return ++RefCount; }
    STDMETHODIMP_(SIZE_T) Release() override
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\Unknwnbase.idl
Code
113
114
115
116
117
    HRESULT QueryInterface(
        [in] REFIID riid,
        [out, iid_is(riid), annotation("_COM_Outptr_")] void **ppvObject);
    ULONG AddRef();
    ULONG Release();
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\Unknwn.h

C++
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
    IUnknown
    {
    public:
        BEGIN_INTERFACE
        virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            _COM_Outptr_  void **ppvObject) = 0;
        
        virtual ULONG STDMETHODCALLTYPE AddRef( void) = 0;
        
        virtual ULONG STDMETHODCALLTYPE Release( void) = 0;
        
        END_INTERFACE
    };
Добавлено через 2 часа 37 минут

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
вопрос не ко мне код не мой.
А чей же?
C++
1
2
3
4
/*=======================================================================
    IMALLOC1.CPP -- Define an imalloc interface
                   (c) Andrey.K., 1996-2024
========================================================================*/
Андрея?

Разве не Вы портировали с Windows 95 и на более современный c++?

0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
14.02.2024, 17:12  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Зачем тип возвращаемое значение поменяли у DAlloc::AddRef() и DAlloc::Release() c ULONG на SIZE_T?
Я менял только для переопределённых функций из IMalloc интерфейса для того чтобы собрать для x64. Для IUnknown я этого не делал, разве это основная проблема сейчас...

Цитата Сообщение от politoto Посмотреть сообщение
А чей же?
Та часть кода о которой идёт речь не моя.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
14.02.2024, 18:21
Лучший ответ Сообщение было отмечено politoto как решение

Решение

Liss29, сделал такой вариант, всё собирается и работает под х86 и под х64. Исправления:
1) Переделал клиента из C++ в Си (lpVtbl->, this, &IID, extern "C")
2) Убрал файлы IMALLOC1.lib и Dalloc.h из каталога клиента
3) Экспортируемая в клиент функция CreateAllocator добавлена в Caller1.c явно без использования Dalloc.h
4) Сделал солюшен к двум проектам для компиляции из студии (у меня VC19)
5) В настройках проекта клиента прописал пути к библиотекам и подключение IMALLOC1.lib
6) В настройках солюшена прописал зависимости, что бы задать порядок компиляции проектов

Всё вроде, может и ещё чего поправил, уже не помню.
Если сделал не то, что хотели, то скажите, чего еще не хватает.
Вложения
Тип файла: zip chap20_1.zip (10.2 Кб, 3 просмотров)
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
14.02.2024, 23:04  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
чего еще не хватает.
Не хватает того самого понимания работы всего этого добра OLE, COM, не понимания мной сути вопроса.
0
15.02.2024, 12:21

Не по теме:

Liss29, посмотрите какую-то книжку сугубо по СОМ, например "Дейл Роджерсон - основы СОМ", при условии что вы знаете на базовом уровне С++, может и поймете суть. Не знаю. СОМ адово сложная технология, я до сих пор понимаю его на уровне копи-паст, там нет логики (ну или надо понимать ООП досконально, хз).

0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
15.02.2024, 12:44
Цитата Сообщение от Morgot Посмотреть сообщение
СОМ адово сложная технология
Нет.
СОМ — это совершенно простая технология, это всего лишь вызов функции по указателю.
0
 Аватар для Morgot
336 / 129 / 18
Регистрация: 26.12.2010
Сообщений: 501
15.02.2024, 17:00
Замабувараев, любая технология, когда ее освоил, кажется простой. Но поначалу, со стороны, это адский ад. Особенно COM WMI на лоу левеле, это какой-то наркоман придумал поди.

А так, вот пример навскидку - чем отличается CLSID от IID ? Без глубокого знания ООП нереально понять (я и до сих пор не понимаю).
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
15.02.2024, 18:31
Цитата Сообщение от Morgot Посмотреть сообщение
чем отличается CLSID от IID ?
Это же довольно просто.

CLSID идентифицирует реализацию. Например, может быть несколько библиотек реализующих один интерфейс, доступ к нужной библиотеке можно получить с помощью её уникального CSLID. CoCreateInstance и прочие функции загружающие библиотеки.

IID идентифицирует интерфейс. Например, один объект поддерживает несколько интерфейсов, доступ к нужному интерфейсу можно получить по его уникальному IID. IUnknown::QueryInterface и многие другие функции запрашивающие нужные интерфейсы.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
15.02.2024, 18:40
Цитата Сообщение от Morgot Посмотреть сообщение
А так, вот пример навскидку - чем отличается CLSID от IID ?
Ничем не отличается. 128‐битное беззнаковое число.
В первом случае это число используется как номер структуры (CLSID), во втором случае это число используется как номер массива с указателями на функции (IID).

Можно было бы взять 64‐битное число, но его уникальность не гарантируется, а для 128‐битного числа вероятность совпадения очень мала.

Добавлено через 7 минут
Цитата Сообщение от Morgot Посмотреть сообщение
любая технология, когда ее освоил, кажется простой
За всей этой чудовищно сложной и нагромождённой «технологией» — стоит всего лишь массив с указателями на функции.

Технология не может быть плохой просто потому что кто‐то сделал функцию с несколькими параметрами которые возвращают указатели на структуру (массив).

Я считаю, что вызывать функции по указателю (вмести имени) — это не настолько сложно, чтобы называть это адским адом и чудовищно сложным процессом.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
15.02.2024, 22:04  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
СОМ — это совершенно простая технология
Да ладно, ага, верю на слово, очень простая. Я пока что ничего не понял кроме того, что нужно создать наследование от нужного тебе интерфейса, реализовать функции этого интерфейса и всё..., всё что я понял. Нужно для начала найти интересующий тебя интерфейс, уже на этом шаге у меня возникли проблемы) там чёрт ногу сломит, ну не один IMalloc же реализован, а дальше, если тебе нужно создать свой интерфейс, вот здесь начинается самое интересное адский ад очень хорошо это описывает. Но, если понимаешь буржуинский и посветит этому определённое время, возможно, результат будет, а так учебников, именно учебников в которых присутствуют задания нет, голая теория ничего не даёт, кроме отчаяния, про учебники на русском я вообще молчу. А я вообще изучал программирование на Win API, конкретнее, программирование на Win API GUI интерфейса, а теперь оказался вон где... какой-то COM.

Цитата Сообщение от Ygg Посмотреть сообщение
Это же довольно просто.
Верю. А как же повторное включение компонентов: включение и агрегирование. Автор книги, Дейл Роджерсон, тоже говорит, что всё очень просто, но как-то после третей главы простота улетучилась. По сути, изучение COM, это изучение нового языка программирования. Я тоже не понимаю различий между CLSID и IID.

Цитата Сообщение от Замабувараев Посмотреть сообщение
За всей этой чудовищно сложной и нагромождённой «технологией» — стоит всего лишь массив с указателями на функции.
К которому не всегда можно получить доступ, как я на своём примере выяснил.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
15.02.2024, 22:53
Цитата Сообщение от Liss29 Посмотреть сообщение
К которому не всегда можно получить доступ, как я на своём примере выяснил.
Как это не всегда. Всегда.
Вы либо явно вызываете функцию по указателю через lpVtbl, либо за вас это делает компилятор. По‐другому и быть не может.
COM = VTable, а VTable = массив с указателями.
Если не будет VTable, то не будет никакого COM.

Добавлено через 42 минуты
Цитата Сообщение от Liss29 Посмотреть сообщение
нужно создать наследование от нужного тебе интерфейса, реализовать функции этого интерфейса и всё..., всё что я понял
А это базовый синтаксис языка C++. У вас не должно быть никаких проблем с такими штуками как наследование, реализация. создание класса и написание функций.
В этом вашем проекте ещё нет ничего специфического для COM. Проект всё ещё не выходит за рамки базового синтаксиса языка C++ стандарта 1998 года.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
15.02.2024, 23:19  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Как это не всегда. Всегда.
И что же я тогда за примеры приводил, где эта самая таблица не создавалась?!

Цитата Сообщение от Замабувараев Посмотреть сообщение
COM = VTable, а VTable = массив с указателями.
Так должно быть, но всегда есть вероятность того, что что-то пойдёт не так. Даже на этом этапе нет чёткого понимания и кто-то говорит о простоте и ясности. С++ при наличии виртуальных функций создаёт эту таблицу автоматически в Си нужно это делать руками, точнее, в OLE(COM) уже кто-то это сделал и остаётся обращаться к этой таблице виртуальных функций, но с другой стороны, как было выяснено в процессе поиска решения моей проблемы, если используется макрос DECLARE_ эта самая таблица не создаётся т.к. указано директива при разворачивании макроса __declspec(NOVTABLE), как-то так. Ну и так далее и тому подобное.

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от Замабувараев Посмотреть сообщение
C++ стандарта 1998 года.
Меня этот стандарт вполне устраивает ведь тогда язык С++ был похож на язык, а не то, что начало происходить с ним начиная с 11 стандарта, крышеснос.



Добавлено через 6 минут

Не по теме:

Цитата Сообщение от Замабувараев Посмотреть сообщение
В этом вашем проекте ещё нет ничего специфического для COM.
И тем не менее пять страниц рассуждений о COM.



Не по теме:

На кой ... она(COM) нужна, если есть С++, совместимость, но разве на плюсах нельзя добиться совместимости, дак зачем этот монстр нужен, ах да, один компонент может содержать несколько интерфейсов объекты С++ такого не могут, но всё же, зачем?

0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
16.02.2024, 00:21
Цитата Сообщение от Liss29 Посмотреть сообщение
А как же повторное включение компонентов: включение и агрегирование. Автор книги, Дейл Роджерсон, тоже говорит, что всё очень просто, но как-то после третей главы простота улетучилась.
Да, это то же просто. Всего лишь несколько дополнительных приёмов наращивания функционала вокруг уже имеющейся реализации помимо стандартного в С++ наследования. Это очень специфичные приёмы, которые не играют существенной роли в архитектуре COM.

...если используется макрос DECLARE_ эта самая таблица не создаётся т.к. указано директива при разворачивании макроса __declspec(NOVTABLE), как-то так.
Вот вообще не понимаю проблемы, что не создаётся, где не создаётся, всё создаётся и работает.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
16.02.2024, 05:23
Цитата Сообщение от Liss29 Посмотреть сообщение
И что же я тогда за примеры приводил, где эта самая таблица не создавалась?!
Это оптимизация для устранения дубликатов, чтобы интерфейсы не плодили лишнее, а заимствовали таблицу из класса.
Цитата Сообщение от Liss29 Посмотреть сообщение
На кой ... она(COM) нужна, если есть С++
Чтобы программы написанные на разных языках программирования могли взаимодействовать между собой.
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
16.02.2024, 07:35
Цитата Сообщение от Liss29 Посмотреть сообщение
указано директива при разворачивании макроса __declspec(NOVTABLE)
Это уже тема Microsoft Visual C++.
https://www.cyberforum.ru/visual-cpp/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2024, 07:35

Access and Excel OLE object
Помогите пожалуста!!!! Как вставить рисунок с OLE object (Image) таблицы EXCEL в таблицу Acces , c помошью макроса в среде ...

ActiveX ole-object с Delphi на Qt
Всем привет. Стоит задача перенести код взаимодействия с OLE-объектами, с Delphi на QT. Вроде ничего необычного, н оне могу достучаться до...

Access and Excel OLE object
Как вствить содержимое image1 в таблицу Accecss ? И как отобразить рисунок на форме Access? Dim etr As Object Dim wbk As...

Импорт файла из OLE Object в attachment
Здравствуйте. В старой БД есть поле типа OLE Object, которое содержит изображения в формате .jpg. Показать на форме это изображение...

Как вставить рисунок с OLE object таблицы EXCEL в таблицу Acces
Как в VBA вставить рисунок с OLE object таблицы EXCEL в таблицу Acces или в другой Excel fayl


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru