Форум программистов, компьютерный форум, киберфорум
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. Показов 14666. Ответов 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
07.02.2024, 10:02
Студворк — интернет-сервис помощи студентам
Liss29, DECLARE_INTERFACE — для интерфейсов, у которых нет родителя. На практике такие интерфейсы не встречаются, потому что у всех интерфейсов есть родитель IUnknown.
DECLARE_INTERFACE_ для всех интерфейсов у которых есть родитель.

И что значит «создать интерфейс»? Экземпляры интерфейса нельзя создать, это абстрактный класс. Интерфейс можно только объявить.
А создать можно класс, унаследованный от интерфейса.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
07.02.2024, 22:57  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
И что значит «создать интерфейс»?
Это значит, что я создаю класс с виртуальными(ну или чисто виртуальными) функциями от которого будут наследоваться реальные классы т.е. классы в которых эти функции будут реализованы или, если это виртуальная, а не чисто виртуальная, функция добавлен какой-то свой функционал. В моём случае эта реализация, но так как создание таблицы виртуальных функций запрещено в макросе DECLARE_INTERFACE_(когда он разворачивается), то я вижу только один выход от наследоваться от классы DAlloc, но это как-то тупо, и, к тому же, класс DAlloc нужно тоже сделать интерфейсом(абстрактным классом), но это уже похоже на создание костылей. Хотя, возможно, я не прав.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
08.02.2024, 09:45
Цитата Сообщение от Замабувараев Посмотреть сообщение
что значит «создать интерфейс»?
А что значило «создавать интерфейс» в том сообщении?
Цитата Сообщение от Замабувараев Посмотреть сообщение
не очень понятно, зачем создавать интерфейс, который повторяет все методы базового интерфейса
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
08.02.2024, 10:08
Цитата Сообщение от politoto Посмотреть сообщение
А что значило «создавать интерфейс» в том сообщении?
Объявить. Продекларировать.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
08.02.2024, 11:37

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
как тогда приводить к нужному типу... через static_cast<>()...
В сторону базовых структур - неявно,
в сторону производных - с помощью явного static_cast
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class c{};
 
template <class derived > 
struct q : public c{
    derived * query() { return static_cast< derived* > ( this ); };
};
 
class d :public q<d>{
    c* get_c() { return this; }
    d*  get_d(c* c) { return static_cast<d*>(c); } 
    d * get_d(){ return q::query(); }
 
    // d * error_d(c*c) { return c; }
    // error C2440: return: невозможно преобразовать "c *" в "d *"
    // note: Для приведения базового класса к производному требуется dynamic_cast или static_cast
    // error: invalid conversion from ‘c*’ to ‘d*’ [-fpermissive]
    //  d * error_d(c*c) { return c; }
    //                            ^^^^^
};



Добавлено через 4 минуты
Цитата Сообщение от Liss29 Посмотреть сообщение
DAlloc::Initialize() вызывается из экспортируемой функции, которая возвращает "клиенту" IMalloc* ?
Нет, она возвращает булево значение. IMalloc* возвращает CreateAllocator. Или я не так вопрос понял...
Откуда в Ваших текущих исходниках вызывается DAlloc::Initialize() ?

Добавлено через 4 минуты
Цитата Сообщение от Liss29 Посмотреть сообщение
когда начинаю собирать CALLER1, то тут появляется клятая ошибка
CALLER1 написан на Си ?

Добавлено через 37 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
так как создание таблицы виртуальных функций запрещено в макросе DECLARE_INTERFACE_(когда он разворачивается), то я вижу только один выход от наследоваться от классы DAlloc, но это как-то тупо
Вы же хотели изучать OLE, а учитесь неправильно использовать макрос, который при изучении OLE может вообще не пригодиться.

Необходимые интерфейсы вроде IOleObject и IDropTarget уже объявлены для нас там, где надо.
https://learn.microsoft.com/en... interfaces

Свой интерфейс можно определять для сопутствующих тем, таких, как Automation (бывшая OLE Automation, а теперь неизвестно что), чтобы пользователи могли писать макросы на Бейсике или других языках, вызывая методы объектов, представленных через интерфейс для управления Вашей програмой. Но это возможно и без собственно OLE.
https://learn.microsoft.com/en... /_automat/
https://learn.microsoft.com/en... -reference
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
08.02.2024, 23:59  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
В сторону базовых структур - неявно,
в сторону производных - с помощью явного static_cast
reinterpret_cast как же? Знаю, что это опасно, что его применение чревато..., что ему плевать что переводить и во что, но всё же его используют, в частности в книге Дейла Роджерсона и не только там. Вообще, как пишет Страуструп, если не ошибаюсь в книге Принципы и практика с использованием C++, приведение типов это признак плохого проектирования..., но в книге Дейла Роджерсона приведения типов повсюду, возможно, это не такое уж и зло?!

Цитата Сообщение от politoto Посмотреть сообщение
Откуда в Ваших текущих исходниках вызывается DAlloc::Initialize() ?
Что-то я не могу понять сути вопроса, вызывается и Caller/Caller1 WndProc --> IDM_CREATE: вы же видели код. \

Цитата Сообщение от politoto Посмотреть сообщение
CALLER1 написан на Си ?
Сохранил его как *.cpp.

Цитата Сообщение от politoto Посмотреть сообщение
Вы же хотели изучать OLE, а учитесь неправильно использовать макрос, который при изучении OLE может вообще не пригодиться.
Я уже и не знаю чему учусь в голове всё перемешалось, но, видимо, данные макросы, это часть темы, которая относится к OLE, а значит нужно их, макросы, тоже понять, хотя я их терпеть не могу, особенно если это макросы вложенные в другие макросы и.т.д. Как изучать, если я пример не могу довести до ума, пример из книги, который каким-то образом собран и не просто собран он ещё и работает, довести до ума так чтобы он собрался и первая преграда это тот самый макрос.

Цитата Сообщение от politoto Посмотреть сообщение
Необходимые интерфейсы вроде IOleObject и IDropTarget уже объявлены для нас там, где надо.
Цитата Сообщение от politoto Посмотреть сообщение
Свой интерфейс можно определять для сопутствующих тем
Зачем мне примеры из "алгебры", если я с "таблицей умножения" разобраться не могу.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
09.02.2024, 06:30
Цитата Сообщение от Liss29 Посмотреть сообщение
вызывается и Caller/Caller1 WndProc --> IDM_CREATE: вы же видели код. \
Где?

Если вызывается метод, которого нет в IMalloc, значит Caller пытается использовать другой интерфейс.

Цитата Сообщение от Liss29 Посмотреть сообщение
Зачем мне примеры из "алгебры", если я с "таблицей умножения" разобраться не могу.
Вы начали с решения более сложной задачи интересными способами.
Зачем 1+1 вычислять методами вариационного исчисления и нестандартного анализа?
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
09.02.2024, 07:23  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Где?
IMALLOC1.rar
CALLER1.rar

Цитата Сообщение от politoto Посмотреть сообщение
Если вызывается метод, которого нет в IMalloc, значит Caller пытается использовать другой интерфейс.
И... это всё же работает. Я же наследую от IMalloc
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
EXPORT LPMALLOC CreateAllocator(void)
{
    DDAlloc* pAllocator = new DDAlloc();
 
    if ((pAllocator != NULL) && (pAllocator->Initialize()))
    {
        pAllocator->AddRef();
    }
    else
    {
        delete pAllocator;
        pAllocator = NULL;
    }
    return (LPMALLOC)pAllocator;
}
Цитата Сообщение от politoto Посмотреть сообщение
Вы начали с решения более сложной задачи интереснымиспособами.
Ну, начал с данного решения не я, а Петзольд, видимо, он счёл, что это вполне приемлемо и доступно.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
09.02.2024, 12:27
Т.о DAlloc::Initialize() вызывается внутри экспортируемой ::CreateAllocator().
Метод DAlloc::Initialize() предназначен для внутреннего использования библиотекой.

CLIENT использует импортируемую ::CreateAllocator() и методы IMalloc.

Добавлено через 18 минут
Клиенту на Си DDaloc.h целиком вообще не нужен.
IMalloc он знает из <windows.h>

Нужно только объявление импортируемой функции
C
1
LPMALLOC CreateAllocator(void);
и библиотека импорта imalloc.lib, полученная при сборке imalloc.dll.

Для клиента на с++ объявление такое:
C++
1
extern "C" LPMALLOC CreateAllocator();
Для хитрого компилятора при желании можно добавить __declspec(dllimport):
C++
1
__declspec(dllimport) extern "C" LPMALLOC CreateAllocator();
Добавлено через 3 часа 59 минут

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
ему плевать что переводить и во что, но всё же его используют
reinterpret_cast не плевать, что во что переводить:
C++
1
bool bdbl = reinterpret_cast<bool> (1.);
(1): error C2440: reinterpret_cast: невозможно преобразовать "double" в "bool"

0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
10.02.2024, 23:51  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Метод DAlloc::Initialize() предназначен для внутреннего использования библиотекой.
И? Хорошо, метод Initialize можно сделать закрытым, вы на это намекаете...

Цитата Сообщение от politoto Посмотреть сообщение
Т.о DAlloc::Initialize() вызывается внутри экспортируемой ::CreateAllocator().
Так и...

Цитата Сообщение от politoto Посмотреть сообщение
Клиенту на Си DDaloc.h целиком вообще не нужен
Видимо, DDalloc сам по себе не нужен.

Цитата Сообщение от politoto Посмотреть сообщение
Нужно только объявление импортируемой функции
Импортируемой?

Что нужно то...? Какое-то ветвление чтобы понять какой язык использует клиент?

Цитата Сообщение от politoto Посмотреть сообщение
reinterpret_cast не плевать, что во что переводить:
А если указатели вместо значений? Не знаю, использование этого приведения многие не одобряют, мотивируя это так как я описал, конечно, не совсем так, но по смыслу и как я понял этот смысл как-то так.

Добавлено через 28 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
Что нужно то...? Какое-то ветвление чтобы понять какой язык использует клиент?
C++
1
2
3
4
#ifndef CINTERFACE
    #define EXPORT extern "C" __declspec (dllexport)
    EXPORT LPMALLOC CreateAllocator();
#endif
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
11.02.2024, 07:36
Цитата Сообщение от Liss29 Посмотреть сообщение
Какое-то ветвление чтобы понять какой язык использует клиент?
Вам не надо определять язык программирования клиента, человек сам решает какой язык программирования ему использовать.
Корпорация Микрософт для экспортируемых функций использует язык Си, а программисты пишущие на других языках сами знают как переводить си‐конструкции на эти языки.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
11.02.2024, 21:38  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Корпорация Микрософт для экспортируемых функций использует язык Си
Для импортируемых функций тоже Си, но и..., что дальше. Я не понял ваш ответ.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
12.02.2024, 08:46
Цитата Сообщение от Liss29 Посмотреть сообщение
приведение типов это признак плохого проектирования..., но в книге Дейла Роджерсона приведения типов повсюду
Может быть, не повсюду, а там, где без него не обойтись?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
STDMETHODIMP DAlloc::QueryInterface(REFIID riid, LPVOID *ppvObj) override
{
    if (  riid == IID_IUnknown // Everyone supports IUnknown 
        || riid == IID_IMalloc  // We support IMalloc 
        )
    {
        this->AddRef();
        *ppvObj = this;
    }
    else
        *ppvObj = nullptr;  //Always initialize "out" parameters to NULL 
  
    if (*ppvObj == NULL)
        return E_NOINTERFACE;   //Interface not supported   
    else    
        return S_OK;        //Interface supported
}
Цитата Сообщение от Liss29 Посмотреть сообщение
наследую от IMalloc
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
EXPORT LPMALLOC CreateAllocator(void)
{
 DDAlloc* pAllocator = new DDAlloc();
if ((pAllocator != NULL) && (pAllocator->Initialize()))
 {
 pAllocator->AddRef();
 }
 else
 {
 delete pAllocator;
 pAllocator = NULL;
 }
 return (LPMALLOC)pAllocator;
}
Почему не так?
C++
13
return pAllocator;
Добавлено через 1 час 58 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
ветвление чтобы понять какой язык использует клиент?
C++
1
2
3
4
#ifndef CINTERFACE
 #define EXPORT extern "C" __declspec (dllexport)
 EXPORT LPMALLOC CreateAllocator();
#endif
__declspec (dllexport) клиентам не нужен.

Добавлено через 19 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
метод Initialize можно сделать закрытым
Как тогда его вызывать из ::CreateAllocator()?
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
12.02.2024, 17:47  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Может быть, не повсюду, а там, где без него не обойтись?
Ну да как иначе то, почти в каждой функции, я ж опять не прав, вновь вижу не то, что написано.

Цитата Сообщение от politoto Посмотреть сообщение
Почему не так?
Этот вопрос не ко мне код не мой.

Цитата Сообщение от politoto Посмотреть сообщение
__declspec (dllexport) клиентам не нужен.
Почему? Теперь и DLL пишут не так как раньше..., как мне показали я так и переделал, вам не угодишь одним так другим эдак.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
12.02.2024, 19:17
Цитата Сообщение от Liss29 Посмотреть сообщение
Почему?
Потому что нужно только чтобы создать DLL, а клиент её не создаёт, он DLL использует.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
12.02.2024, 22:03  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Потому что нужно только чтобы создать DLL, а клиент её не создаёт, он DLL использует.
Выкинул из DDalloc всё DDalloc оказался пустым, он лишний на этом празднике жизни. Тогда как же с сокрытием интерфейса?! В файле DAlloc.h мало того, что присутствует реализация функций, так ещё присутствуют поля данных, которые точно должны быть скрыты. Или это уже не актуально.
Короче говоря вернусь к своим "баранам": дык-с, что там на счёт реализации интерфейса DAlloc с помощью макроса, я почему то не могу найти решения, если я тупой, то подскажите что всё же не так у меня в коде и как это что-то исправить.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
12.02.2024, 22:53
Цитата Сообщение от Liss29 Посмотреть сообщение
Тогда как же с сокрытием интерфейса?!
Спутали класс с интерфейсом? Интерфейс не скрывают, интерфейс всегда публичный и выдаётся на компьютер клиента в виде заголовочного файла.
Класс всегда непубличный, и клиенту не показывается.
Цитата Сообщение от Liss29 Посмотреть сообщение
В файле DAlloc.h мало того, что присутствует реализация функций
Нет никаких проблем. Не показывайте реализацию интерфейса клиенту.
У клиента уже есть всё что нужно: IMalloc лежит в заголовочных файлах виндоуз. Ни про какие файлы DAlloc.h с вашей реализацией клиент знать не должен.

Клиенту нужно сделать только пару вещей: знать определение функции CreateAllocator() и подключить скомпилированную DLL с вашим классом.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
12.02.2024, 23:28  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Спутали класс с интерфейсом?
Ничего я не путаю у Страуструпа это называется интерфейсная часть класса...
Интерфейс класса — это набор методов класса, доступных для использования другими классами.Интерфейс специфицирует класс, чётко определяя все возможные действия над ним.

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

При описании интерфейса класса важно соблюсти баланс между гибкостью и простотой.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Класс всегда непубличный, и клиенту не показывается.
Что за класс? *.cpp-файл, это под классом понимается или что? Я сейчас говорю о С++ классах.

Цитата Сообщение от Замабувараев Посмотреть сообщение
У клиента уже есть всё что нужно: IMalloc лежит в заголовочных файлах виндоуз. Ни про какие файлы DAlloc.h с вашей реализацией клиент знать не должен.
Не знаю, не знаю Caller1 без DAlloc.h собираться не хочет, даже, если подключить IMalloc1.lib и файл IMalloc1.dll закинуть в ту же папку.

Короче говоря: "ясно, что ничего не ясно!".
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
13.02.2024, 00:17
Цитата Сообщение от Liss29 Посмотреть сообщение
Не знаю, не знаю Caller1 без DAlloc.h собираться не хочет
Ошибки компиляции? Какая?

Добавлено через 13 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
Ничего я не путаю у Страуструпа это называется интерфейсная часть класса...
Чтобы не было путаницы. В COM используется понятие «интерфейс». В C++ отдельной сущности интерфейсов нет, COM‐интерфейсы эмулируются через абстрактные классы с чистыми виртуальными функциями.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
13.02.2024, 00:27  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Ошибки компиляции? Какая?
Файл DAlloc не может найти. Это в том случае, если я файл DDAlloc из проекта исключил, если же он присутствует в сборке DLL, то требует и этот файл.

Добавлено через 8 минут
Цитата Сообщение от Замабувараев Посмотреть сообщение
В C++ отдельной сущности интерфейсов нет,
Я цитаты кому выкладывал... я же их не сам придумал, к сожалению!

Цитата Сообщение от Замабувараев Посмотреть сообщение
COM‐интерфейсы эмулируются через абстрактные классы с чистыми виртуальными функциями.
Это я уже понял по интерфейсам IUnknown и IMalloc. Но всю жизнь испортили макросы, а там ещё есть агрегирование и ещё что-то страшное DCOM называется, это, по сути, новый язык, к этой теме нужно так и подходить как к изучению нового языка, а не так как Петзольд, вроде, что-то такое незначительное, как кнопку нарисовать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2024, 00:27

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Администрация Хабра удаляет новые алгоритмы, которые не западно ориентированной философии кода, без уведомлений и объяснений.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
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 с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru