Форум программистов, компьютерный форум, киберфорум
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. Показов 15189. Ответов 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
28.01.2024, 08:35
Студворк — интернет-сервис помощи студентам
В интерфейсе не могут быть никакие конструкторы, деструкторы, поля, члены класса и инициализаторы.
0
2737 / 892 / 331
Регистрация: 10.02.2018
Сообщений: 2,136
28.01.2024, 09:07
Цитата Сообщение от Замабувараев Посмотреть сообщение
В интерфейсе не могут быть никакие конструкторы, деструкторы, поля, члены класса и инициализаторы.
В объявлении интерфейса не могут, но там речь уже о реализации интерфейса. Скорее всего, для Си всё необходимое для реализации интерфейса располагается где-то отдельно от "класса". В Си же нет классов, мемберов и this, а структуры могут содержать только указатели на глобальные функции без привязки к конкретному экземпляру. Никогда не занимался интерфейсами под Си, поэтому не знаю как обычно там реализуется подобное.

Liss29, пожалуйста, выложите весь исходный проект без своих экспериментальных правок. Сложно обсуждать какие-либо ошибки не имея перед глазами всего кода.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
28.01.2024, 10:47
Цитата Сообщение от Liss29 Посмотреть сообщение
как лучше или точнее, как правильно?
Теперь ясно, зачем закрыта макросом часть кода:
Зачем вообще клиентскому коду на любом языке знать что-либо про struct DAlloc и, тем более про то, как он устроен, если клиент получает LPMALLOC функцией CreateAllocator(), и работает с компонентом через методы IMalloc, о котором и клиент, и сервер и так уже наслышаны откуда-то из C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\objidlbase.h?

IMALLOC.H - какая-то ошибка проектирования или рефакторинга, если он используется в CALLER.C.

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

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
PETZOLD.png
Зачем скриншотить Проводник, если можно список файлов просто написать в сообщении?



Добавлено через 16 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
Или всё же вот так:
C++
1
2
3
4
5
struct DAlloc : IMalloc
{
 
//...
};
Лучше так определить class или struct DAlloc внутри IMALLOC.CPP и никому не показывать.

Реализицию методов IMalloc, конструкторов, деструкторов DAlloc можно по вкусу тестуально включить внутрь определения класса inline (убрав лишние DAlloc::), или оставить снаружи, как сейчас.

И никаких DECLARE_INTERFACE_ и CINTERFACE!

Добавлено через 11 минут
Объявление функции
C
1
LPMALLOC CreateAllocator();
если она импортируется из IMALLOC.DLL через библиотеку импорта IMALLLOC.LIB,
можно добавить в CALLER.C прямо там, где она используется.
Или сделать для неё отдельный заголовочный файл, дополняющий IMALLLOC.LIB

Цитата Сообщение от Liss29 Посмотреть сообщение
У Петзольда
Или у Пола Яо?
C++
1
2
3
4
/*=======================================================================
    IMALLOC.CPP -- Define an imalloc interface
                   (c) Paul Yao, 1996
========================================================================*/
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
28.01.2024, 17:15  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
В интерфейсе не могут быть никакие конструкторы, деструкторы, поля, члены класса и инициализаторы.
В интерфейсах OLE или С++?
А как же кусок кода, который явно внесён в определение интерфейса DAlloc, разве в нём нет конструктора, деструктора, ах да, это же реализация, а не объявление... Да, этот кусок кода закрыт макросом, но он там присутствует, не так ли.

Цитата Сообщение от Ygg Посмотреть сообщение
пожалуйста, выложите весь исходный проект без своих экспериментальных правок. Сложно обсуждать какие-либо ошибки не имея перед глазами всего кода.
Ну, если вам нужны именно оригиналы Петзольда, а не мои, то вот, пожалуйста:
CHAP20.rar

Цитата Сообщение от politoto Посмотреть сообщение
Зачем вообще клиентскому коду на любом языке знать что-либо про struct DAlloc и, тем более про то, как он устроен, если клиент получает LPMALLOC функцией CreateAllocator(), и работает с компонентом через методы IMalloc, о котором и клиент, и сервер и так уже наслышаны откуда-то из C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\objidlba se.h?
Он, DAlloc, определяет(реализует) функции интерфейса IMalloc. Кстати выделяет то функция память для DAlloc, хотя DAlloc является частным случаем IMalloc, но тем не менее...

Цитата Сообщение от politoto Посмотреть сообщение
И никаких DECLARE_INTERFACE_ и CINTERFACE!
Но тогда пропадает возможность использования различных языков программирования, разве не вы об этом писали выше, отвечая на мой вопрос, который как раз касался данных макросов.

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
Или у Пола Яо?
Тут я ничего не трогал что было, то и выложил, книга Петзольда, примеры тоже его, может быть, это его псевдоним.:D

0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
28.01.2024, 17:44  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Лучше так определить class или struct DAlloc внутри IMALLOC.CPP и никому не показывать.
Что-то подобное имеете ввиду:
Кликните здесь для просмотра всего текста
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
class DAlloc : public IMalloc
{
    public:
        DAlloc():RefCount(0), hHeap(NULL) { }
        ~DAlloc() 
        { 
            if(hHeap)
                HeapDestroy(hHeap);
        }
        STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObject);
        
        STDMETHODIMP_ (SIZE_T) AddRef() { return ++RefCount; }
        STDMETHODIMP_ (SIZE_T) Release () 
        {
            if (0 != --RefCount)
                return RefCount;
 
            delete this;
            return 0;
        }
    private:
        SIZE_T RefCount;
        HANDLE hHeap;
};
0
2737 / 892 / 331
Регистрация: 10.02.2018
Сообщений: 2,136
28.01.2024, 18:19
Цитата Сообщение от Liss29 Посмотреть сообщение
Ну, если вам нужны именно оригиналы Петзольда, а не мои, то вот, пожалуйста
Судя по коду получается, что это даже не полноценный COM, а предварительная демонстрация всего лишь одной из идей COM. А именно идеи совместимости компонент на языках Си и С++. В таком контексте макросы конечно нужно изучать более внимательно. В библиотеке макросы разворачиваются в один код, а в вызывающей её программе в совсем другой. Получается, что из Си-шного кода производится эмуляция вызов мемберов экземпляра класса из С++. Заголовочный файл "IMalloc.h" в библиотеке используется для реализации интерфейса, а в вызывающей программе он уже выступает в роли объявления интерфейса. При такой двойственной роли "IMalloc.h" без макросов и условной компиляции не обойтись.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.01.2024, 18:48
Цитата Сообщение от Liss29 Посмотреть сообщение
В интерфейсах OLE или С++?
В интерфейсах COM.
В C++ вообще нет такой сущности как «интерфейс». Ближайший аналог — абстрактный класс с чисто виртуальными методами.
Цитата Сообщение от Liss29 Посмотреть сообщение
разве в нём нет конструктора, деструктора, ах да, это же реализация, а не объявление
Удалите эти штуки из вашего абстрактного класса, сделайте новый класс унаследованный от интерфейса, и вынесите их в cpp файл.
Цитата Сообщение от Liss29 Посмотреть сообщение
Что-то подобное имеете ввиду:
Нет. Клиенту предоставляется ТОЛЬКО интерфейс. Объявление класса оставляете у себя на компьютере и клиенту не показываете.
Цитата Сообщение от Liss29 Посмотреть сообщение
Но тогда пропадает возможность использования различных языков программирования, разве не вы об этом писали выше, отвечая на мой вопрос, который как раз касался данных макросов.
Если ваша скомпилированная библиотека оформлена по всем правилам COM, то клиент может быть написан на любом языке программирования.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
28.01.2024, 23:23  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
В C++ вообще нет такой сущности как «интерфейс».
Да ладно!

Цитата Сообщение от Замабувараев Посмотреть сообщение
Удалите эти штуки из вашего абстрактного класса, сделайте новый класс унаследованный от интерфейса, и вынесите их в cpp файл.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Нет. Клиенту предоставляется ТОЛЬКО интерфейс. Объявление класса оставляете у себя на компьютере и клиенту не показываете.
Не знаю, верно ли я вас понял, но, возможно, вы это имеете ввиду:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class DDAlloc : public DAlloc
{
    public:
        DDAlloc() { }
 
        ~DDAlloc() { } 
    
        STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObject)
        {
            return ::QueryInterface(riid, ppvObject);
        }
        
        STDMETHODIMP_ (SIZE_T) AddRef() { return ::AddRef(); }
        STDMETHODIMP_ (SIZE_T) Release ()  { return ::Release(); }
        //Other functions....
};


Цитата Сообщение от Замабувараев Посмотреть сообщение
Если ваша скомпилированная библиотека оформлена по всем правилам COM, то клиент может быть написан на любом языке программирования.
Видимо в этом и есть суть главы, показать, как это делать, дать краткое введение в тему. Но мы здесь уже от темы главы отошли, но, возможно, что это мне это кажется или не только мне?


Цитата Сообщение от Ygg Посмотреть сообщение
Судя по коду получается, что это даже не полноценный COM, а предварительная демонстрация всего лишь одной из идей COM.
В главе говорится о OLE, а не о COM. Да, это введение в данную тему.

Цитата Сообщение от Ygg Посмотреть сообщение
При такой двойственной роли "IMalloc.h" без макросов и условной компиляции не обойтись.
Т.е. проект придётся собирать из командной строки, я прав?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.01.2024, 07:30
Цитата Сообщение от Liss29 Посмотреть сообщение
Что-то подобное имеете ввиду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class DAlloc : public IMalloc
{
 public:
 DAlloc():RefCount(0), hHeap(NULL) { }
 ~DAlloc() 
 { 
 if(hHeap)
 HeapDestroy(hHeap);
 }
 STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObject);
STDMETHODIMP_ (SIZE_T) AddRef() { return ++RefCount; }
 STDMETHODIMP_ (SIZE_T) Release () 
 {
 if (0 != --RefCount)
 return RefCount;
delete this;
 return 0;
 }
 private:
 SIZE_T RefCount;
 HANDLE hHeap;
};
Если всё это в IMALLOC.CPP, и ни один клиент не знает ничего о class DAlloc, то да, то да.

Добавлено через 36 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
мы здесь уже от темы главы отошли
В то время, когда это книга вышла, согласно тогдашним Постановлениям Президиума, OLE официально уже не была Object Linking and Embedding, а была просто OLE.
Так что тему можно было назвать "OLE ( в прошлом Object Linking and Embedding )".
Если я правильно понимаю последние Постановления Президиума, то сейчас просто OLE - часть Component Object Model ( Модели COM ), а Linking and Embedding - одна из частей OLE.
https://learn.microsoft.com/en... /api/ole2/

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
книга Петзольда, примеры тоже его, может быть, это его псевдоним.:D
Или почти соватор.
Цитата Сообщение от Charles Petzold
Paul Yao definitely deserves a very-long standing ovation for helping get the book into production by taking on the work of two new chapters, Chapters 12 and 20. Thanks also to Kraig Brockschmidt, Nancy Cluts, and Evangelos Petroutsos for reviewing chapters.

0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
29.01.2024, 07:56
Цитата Сообщение от Liss29 Посмотреть сообщение
В главе говорится о OLE, а не о COM. Да, это введение в данную тему.
OLE — это надстройка над COM.

Добавлено через 7 минут
По поводу COM есть замечательная книга «Основы COM» Дейл Роджерсон, где буквально по кирпичикам рассказывается как с этим работать.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.01.2024, 08:37
Историческая Object Linking and Embedding не была основана на COM, потому что не было тогда никаких COM.
COM понадобился OLE2 для реализаций Win32 с раздельными адресными пространствами процессов.

C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\ole.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*****************************************************************************\
*                                                                             *
* ole.h -       Object Linking and Embedding functions, types, and definitions*
*                                                                             *
*               Version 1.0                                                   *
*                                                                             *
*               NOTE: windows.h must be #included first                       *
*                                                                             *
*               Copyright (c) Microsoft Corporation. All rights reserved.     *
*                                                                             *
\*****************************************************************************/
 
#ifndef _INC_OLE
#define _INC_OLE
Простые, не связанные между собой, таблички CALLBACK-функций. Никаких тебе IMarshal, IUnknown и прочая COM.
C
1
2
3
4
5
6
7
8
9
10
11
12
/* Stream definitions */
typedef struct _OLESTREAMVTBL
{
    DWORD (CALLBACK* Get)(LPOLESTREAM, void FAR*, DWORD);
    DWORD (CALLBACK* Put)(LPOLESTREAM, OLE_CONST void FAR*, DWORD);
} OLESTREAMVTBL;
typedef  OLESTREAMVTBL FAR*  LPOLESTREAMVTBL;
 
typedef struct _OLESTREAM
{
    LPOLESTREAMVTBL      lpstbl;
} OLESTREAM;
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct _OLESERVERDOCVTBL
{
    OLESTATUS (CALLBACK* Save)      (LPOLESERVERDOC);
    OLESTATUS (CALLBACK* Close)     (LPOLESERVERDOC);
    OLESTATUS (CALLBACK* SetHostNames)(LPOLESERVERDOC, OLE_LPCSTR, OLE_LPCSTR);
    OLESTATUS (CALLBACK* SetDocDimensions)(LPOLESERVERDOC, OLE_CONST RECT FAR*);
    OLESTATUS (CALLBACK* GetObject) (LPOLESERVERDOC, OLE_LPCSTR, LPOLEOBJECT FAR*, LPOLECLIENT);
    OLESTATUS (CALLBACK* Release)   (LPOLESERVERDOC);
    OLESTATUS (CALLBACK* SetColorScheme)(LPOLESERVERDOC, OLE_CONST LOGPALETTE FAR*);
    OLESTATUS (CALLBACK* Execute)  (LPOLESERVERDOC, HGLOBAL);
} OLESERVERDOCVTBL;
typedef  OLESERVERDOCVTBL FAR*  LPOLESERVERDOCVTBL;
 
typedef struct _OLESERVERDOC
{
    LPOLESERVERDOCVTBL lpvtbl;
} OLESERVERDOC;
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.01.2024, 08:52
Цитата Сообщение от Замабувараев Посмотреть сообщение
По поводу COM есть замечательная книга «Основы COM» Дейл Роджерсон
Эта книга официально переведена и издана на русском.
Материалы к книге есть на github
https://github.com/tpn/inside-com
В том числе ранний проект спецификации COM
https://github.com/tpn/inside-... M_SPEC.RTF
Вложения
Тип файла: zip COM_SPEC.zip (438.1 Кб, 3 просмотров)
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.01.2024, 08:58
А вот Inside OLE, Kraig Brockschmid "Русская Редакция" в своё время опасалась переводить.
Слишком умная книга...
К тому же она была в старом MSDN: все, кому было интересно, уже прочитали.
https://github.com/kraigb/InsideOLE/tree/main
0
2737 / 892 / 331
Регистрация: 10.02.2018
Сообщений: 2,136
29.01.2024, 13:47
Цитата Сообщение от Liss29 Посмотреть сообщение
В главе говорится о OLE, а не о COM. Да, это введение в данную тему.
Какое отношение COM-овские макросы имеют к OLE? А если у вас возникнут вопросы к виртуальным функциям C++ классов в рамках рассматриваемой темы, то вы так же будете утверждать, что вопросы относятся к OLE или всё же к языку C++?

Цитата Сообщение от Liss29 Посмотреть сообщение
Т.е. проект придётся собирать из командной строки, я прав?
Одно с другим вообще никак не связано. Собирать C и C++ можно с помощью чего угодно, хоть командной строкой, хоть через студийный проект, хоть через CMake. Все варианты позволяют настраивать сборку с любыми опциями.
0
29.01.2024, 15:28

Не по теме:

Заполнение VTBL на Си для OLE без COM.
https://github.com/spacerace/M... 4C1-L110C1
Copyright (c) Microsoft Corporation, 1990-

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
56
BOOL InitClient (HANDLE hInstance)
    {
    
    // Set up the client structure
 
    if (!(hobjClient = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,
                                   sizeof(ECDCLIENT))))
            return FALSE;
 
    if (!(lpclient = (LPECDCLIENT)(GlobalLock(hobjClient))))
        {
        GlobalFree(hobjClient);
        hobjClient = NULL;
        return FALSE;
        }
 
    lpclient->lpvtbl = (LPECDCLIENTVTBL)&clientTbl;
 
    lpclient->lpvtbl->CallBack = MakeProcInstance(CallBack, hInstance);
 
    // Set up the stream structure
 
    if (!(hobjStream = GlobalAlloc (GMEM_MOVEABLE, sizeof(APPSTREAM))))
        {
        GlobalUnlock(hobjClient);
        GlobalFree(hobjClient);
        hobjClient = NULL;
        return FALSE;
        }
 
    if(lpstream = (LPAPPSTREAM)(GlobalLock(hobjStream)))
        {
        lpstream->lpstbl = (LPECDSTREAMVTBL)&streamTbl;
        streamTbl.Get =
            (LONG  (pascal far *) (LPECDSTREAM, LPSTR, LONG))
            MakeProcInstance((FARPROC) ReadStream, hInstance);
        streamTbl.Put =
            (LONG  (pascal far *) (LPECDSTREAM, LPSTR, LONG))
            MakeProcInstance((FARPROC) WriteStream, hInstance);
        streamTbl.Seek =
            (LONG  (pascal far *) (LPECDSTREAM, LONG))
            MakeProcInstance((FARPROC) PosStream, hInstance);
        streamTbl.Status =  MakeProcInstance((FARPROC) StatusStream, hInstance);
        lpstream->hobjStream = hobjStream;
        }
    else
        {
        GlobalUnlock(hobjClient);
        GlobalFree(hobjClient);
        hobjClient = NULL;
        GlobalFree(hobjStream);
        hobjStream = NULL;
        return FALSE;
        }
    return TRUE;
}

0
2737 / 892 / 331
Регистрация: 10.02.2018
Сообщений: 2,136
29.01.2024, 15:51
politoto, я нигде не утверждал, что без COM нельзя совместить модули Си и С++. В коде стартового сообщения и в исходном коде архива используются очень специфичные макросы (DECLARE_INTERFACE_, STDMETHOD, THIS_) и интерфейсы (IMalloc и IUnknown). Всё это явно указывает на COM, при этом совершенно ничего в коде не указывает на OLE. Но каждый раз когда я говорю про COM автор упорно меня поправляет на тему OLE. Как я понял, все непонятки были вызваны исключительно макросами COM, поэтому я не вижу смысла говорить пока про OLE, до OLE дело ещё не дошло)
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
29.01.2024, 16:45
Цитата Сообщение от politoto Посмотреть сообщение
Историческая Object Linking and Embedding не была основана на COM, потому что не было тогда никаких COM.
Вот и пусть 16‐битное OLE остаётся для 16‐битных систем.
А в современном мире OLE 2.0 — это всего лишь надстройка над COM.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.01.2024, 20:28
Цитата Сообщение от Замабувараев Посмотреть сообщение
пусть 16‐битное OLE остаётся для 16‐битных систем.
Соответствующие библиотеки импорта есть даже для Windows 10 на 64-разрядном ARM:
Windows Batch file
1
dir /s /b "\Program Files (x86)\Windows Kits\10\lib\ole???32.lib
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\arm\OleAut32.Lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\arm\olecli32.lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\arm\olesvr32.lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\arm64\OleAut32.Lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\arm64\olecli32.lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\arm64\olesvr32.lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\OleAut32.Lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\olecli32.lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\olesvr32.lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x86\OleAut32.Lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x86\olecli32.lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x86\OlePro32.Lib
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x86\olesvr32.lib
В тоже время 16-разрядные OLE 2.0x с COM на LRPC устанавливались с 16-разрядными WinWord 6.0 и Excel 5.0
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
01.02.2024, 09:24
32-разрядные DLL изначального OLE в 64-разрядной Windows 10 импортируют из USER32.dll уже полюбившиеся автору вопроса функции.
Code
1
2
3
4
5
6
7
8
9
C:link /dump /imports %windir%\SysWOW64\olecli32.dll | findstr DDE
                  118 FreeDDElParam
                  3AD UnpackDDElParam
                  2A1 PackDDElParam
 
C:link /dump /imports %windir%\SysWOW64\olesvr32.dll | findstr DDE
                  3AD UnpackDDElParam
                  2A1 PackDDElParam
                  118 FreeDDElParam
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
02.02.2024, 16:35  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
32-разрядные DLL изначального OLE в 64-разрядной Windows 10 импортируют из USER32.dll уже полюбившиеся автору вопроса функции.
Т.е. эта приблуда(COM, OLE) работает на основе DDE, того самого DDE, которое уже давно никому "даром не далась", потому что есть более совершенные механизмы межпроцессорного обмена данными? Как же это так... какое непотребство ай-яй-яй.

А что по поводу vtbl, почему эта таблица не создаётся, если макрос DECLARE_INTERFACE_ разворачивается как С++ класс? В любом случае классы IUnknown, IMalloc абстрактные значить для них таблица виртуальных функций точно должна строиться. С этим вопросом почему то так и не разобрались(.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.02.2024, 16: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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера 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 (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru