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

OLE(Object Linking and Embedding)?

24.01.2024, 23:07. Показов 15259. Ответов 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
2737 / 892 / 331
Регистрация: 10.02.2018
Сообщений: 2,136
06.03.2024, 08:28
Лучший ответ Сообщение было отмечено politoto как решение

Решение

Студворк — интернет-сервис помощи студентам
Liss29, я согласен с предыдущим комментарием. В коде примера (pubmem.h) присутствует какая-то странная идея и её запутанная реализация (совмещение определения и реализации интерфейса), если ещё сверху приправить это устареванием кода (возможно опция novtable появилось позже создания примера), то вылезает описанная вами ошибка (виртуальная таблица заполнена байтами CD). Точечно устранить её можно добавив вверху файла "pubmem.h" такие строки:
C++
1
2
3
4
5
6
7
8
#ifndef PUBMEM_H
#define PUBMEM_H
 
// нужно добавить эти четыри строки
#ifndef CINTERFACE
#undef DECLSPEC_NOVTABLE
#define DECLSPEC_NOVTABLE
#endif
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
06.03.2024, 21:45  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Опять интерфейс содержит какие‐то поля?
Это же не мои примеры, сколько раз говорить, что взял у Петзольда, то и выложил не знаю, как они у него работают, собираются... Даже если так, то зачем он вновь определяет интерфейсы мне непонятно, разве DAlloc и DClassFactory не должны быть реализациями зачем ещё раз объявлять интерфейсы, если в них никаких новых функций не добавляется, возможно, это какой-то приём программирования для большей универсальности или зачем?

Добавлено через 13 минут
Цитата Сообщение от Ygg Посмотреть сообщение
Точечно устранить её можно добавив вверху файла "pubmem.h" такие строки:
Да, так работает, всё получилось.

Цитата Сообщение от Ygg Посмотреть сообщение
В коде примера (pubmem.h) присутствует какая-то странная идея и её запутанная реализация (совмещение определения и реализации интерфейса), если ещё сверху приправить это устареванием кода (возможно опция novtable появилось позже создания примера), то вылезает описанная вами ошибка (виртуальная таблица заполнена байтами CD).
Возможно, так и есть, код собрался и как предполагалось ранее всему виной является __declspec(novtable); Зачем он пытался совместить определение и реализацию интерфейса сказать не могу ему виднее на этот счёт Петзольд ничего не написал.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.03.2024, 09:12

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
что взял у Петзольда, то и выложил не знаю, как они у него работают, собираются...
Петзольд - не Кнут, чтобы самому компилировать его книги.


Из всего pubmem.h в callpub.c нужны только 3 строчки, в которых определяется CLSID:
C
1
2
3
DEFINE_GUID(CLSID_ALLOCATOR,
    0x308d0430, 0x1090, 0x11cf, 0xb9,
    0x2a, 0x0, 0xaa, 0x0, 0x62, 0x38, 0xf8);
Цитата Сообщение от Ygg Посмотреть сообщение
Точечно устранить её можно
Или заменить всё подобное шаманство
C++
57
58
59
60
#undef  INTERFACE                                                                                       
#define INTERFACE DClassFactory                                                                                                                                                                                  
 
DECLARE_INTERFACE_(DClassFactory, IClassFactory)
просто на что-нибудь вроде
C++
1
struct DClassFactory : public IClassFactory
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
07.03.2024, 13:12
Цитата Сообщение от Liss29 Посмотреть сообщение
Это же не мои примеры, сколько раз говорить, что взял у Петзольда, то и выложил
Вы взяли чужой неработающий пример с ошибками, и не хотите исправлять чтобы он работал?
Не понял.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
08.03.2024, 06:32  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Или заменить всё подобное шаманство
Цитата Сообщение от politoto Посмотреть сообщение
просто на что-нибудь вроде
Ну, может быть, из-за того, что в таком случае проекты, созданные на разных языках, не будут собираться, нет?

Цитата Сообщение от Замабувараев Посмотреть сообщение
Не понял.
Чего?! Не кажется ли, что я этому итак много времени отдал, а что в итоге... Я книги не пишу, деньги за них не получаю, в качестве обучения они мне ничего не дали, кроме разочарования в себе, а так проект заработал и заработал так как был изначально реализован автором, да с небольшими изменениями, но всё же не кардинальными, сервер написан на С++ в нём применяются макросы, как автор и задумывал, а клиент на Си и это собралось и заработало. Что ещё не так.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
09.03.2024, 17:43

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
в качестве обучения они мне ничего не дали
А чему Вы учились, если не секрет?
В чём практиковались, над чем работали, тому и научились, скорее всего.

0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
09.03.2024, 21:47  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
В чём практиковались, над чем работали, тому и научились, скорее всего.
Тебе виднее, по...деть вы очень любите, ни времени ни сил, печатать страницами, не жаль, а ответ на вопрос, ну, это как получиться.

Добавлено через 28 секунд
Цитата Сообщение от politoto Посмотреть сообщение
А чему Вы учились, если не секрет?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
18.04.2024, 16:01
Цитата Сообщение от Liss29 Посмотреть сообщение
работает на основе DDE, того самого DDE, которое уже давно никому "даром не далась"
Работа OLE 1.0 в 64-разрядной Windows 10 на основе того самого DDE о тридцати двух разрядах.
Выполняется
C
1
2
3
4
5
     LHCLIENTDOC doc = 0;
     OLESTATUS regStatus =  OleRegisterClientDoc("Cyber", "CyberDoc", 0L, &doc);
     OLECLIENT client = { &(OLECLIENTVTBL) {CallBack} };
     LPOLEOBJECT object = 0;
     OLESTATUS creStatus = OleCreate("StdFileEditing", &client, "pbrush", doc, "1", &object, olerender_format, CF_BITMAP);
OleCreate() из <ole.h>, а не из новомодного <ole2.h>
https://learn.microsoft.com/en... -olecreate (документация TBD, а пока скопипастана из новомодной, в том числе и Requirements).
Для этого перед
#include <windows.h>
нужно определить
#define INC_OLE1
Кликните здесь для просмотра всего текста
64-разрядная программа соберается, но с моей Windows 10 не поставляются 64-разрядные olesvr32.dll и olecli32.dll, поэтому протестировать могу только 32-разрядный вариант.
Code
1
2
3
4
5
6
7
8
9
10
11
12
0003049E S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C00A ("OLEsystem")
000304A0 S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C00A ("OLEsystem")
000503F4 S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C00A ("OLEsystem")
0009043A S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C00A ("OLEsystem")
00090034 S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C009 ("System")
002D0A1A S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C009 ("System")
024B075E S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C009 ("System")
003009F4 S WM_DDE_ACK hwnd:024B075E aApp:C0A9 ("pbrush") aTopic:C009 ("System")
003109C2 S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C009 ("System")
003009F4 S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C009 ("System")
04360780 S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C009 ("System")
000F0A26 S WM_DDE_INITIATE hwnd:003009F4 aApp:C0A9 ("pbrush") aTopic:C009 ("System")
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
024B075E P WM_DDE_EXECUTE hwnd:003009F4 lPackedVal:04370014 hCommands:04370014
003009F4 P WM_DDE_ACK hwnd:024B075E lPackedVal:0122F850 wStatus:0000 hCommands:0122F850
00090034 S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
00110AD0 S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
00D80292 S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
013C03EC S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
0200079A S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
002C0B4A S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
010D0674 S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
002D0A1A S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
024B075E S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
00140A9C S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
00110AD0 S WM_DDE_ACK hwnd:00140A9C aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
003109C2 S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
003009F4 S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
Code
1
2
3
4
5
6
7
8
000503F4 S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
0009043A S WM_DDE_INITIATE hwnd:00110AD0 aApp:C0A9 ("pbrush") aTopic:C099 ("Cyber%CyberDoc%3#003")
00140A9C P WM_DDE_ADVISE hwnd:00110AD0 lPackedVal:02B47530 hOptions:0000 aItem:7530 ("#30000")
00110AD0 P WM_DDE_ACK hwnd:00140A9C lPackedVal:011EF1B8 wStatus:0000 hCommands:011EF1B8
00140A9C P WM_DDE_ADVISE hwnd:00110AD0 lPackedVal:02B33F48 hOptions:0000 aItem:3F48 ("#16200")
00110AD0 P WM_DDE_ACK hwnd:00140A9C lPackedVal:012014C8 wStatus:0000 aItem:14C8 ("#5320")
00140A9C P WM_DDE_EXECUTE hwnd:00110AD0 lPackedVal:0437001C hCommands:0437001C
00110AD0 P WM_DDE_ACK hwnd:00140A9C lPackedVal:012014B8 wStatus:0000 aItem:14B8 ("#5304")
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2024, 16:01

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


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

Или воспользуйтесь поиском по форуму:
168
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru