Форум программистов, компьютерный форум, киберфорум
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. Показов 14659. Ответов 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
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
20.02.2024, 08:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Liss29 Посмотреть сообщение
появляется ошибка "Error: No allocator", короче говоря функция CoCreateInstance не отрабатывает.
Код причины неудачи, который вернула CoCreateInstance() вы с соавторами положили в hr.
Что там в hr?
E_CLASSNOTREG ?

Добавлено через 26 минут
shared/winerror.h:
C
30127
30128
30129
30130
30131
30132
30133
30134
//
// MessageId: REGDB_E_CLASSNOTREG
//
// MessageText:
//
// Class not registered
//
#define REGDB_E_CLASSNOTREG              _HRESULT_TYPEDEF_(0x80040154L)
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
20.02.2024, 13:20
Цитата Сообщение от Liss29 Посмотреть сообщение
библиотека DLL на С++
Вы же только что код библиотеки на си переделывали. Уже передумали и вернулись на си плас плас?
0
20.02.2024, 13:51

Не по теме:

Цитата Сообщение от Замабувараев Посмотреть сообщение
Какой объект создастся? Ваш или чужой?
Какой-то майкрософтовский объект в недрах MSPAINT.EXE.

Windows Batch file
1
tasklist /FI "IMAGENAME eq mspaint.exe" & echo starting... & start pb.vbs & echo msgbox & tasklist /FI "IMAGENAME eq mspaint.exe"
Code
1
2
3
4
5
6
7
Информация: Задачи, отвечающие заданным критериям, отсутствуют.
starting...
msgbox
 
Имя образа                     PID Имя сессии          № сеанса       Память
========================= ======== ================ =========== ============
mspaint.exe                   1304 Console                    1     7 356 КБ
Кликните здесь для просмотра всего текста
Code
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
FILEVERSION    10,0,19041,4046
PRODUCTVERSION 10,0,19041,4046
FILEFLAGSMASK  0x3F
FILEFLAGS      0x0
FILEOS         VOS_NT_WINDOWS32
FILETYPE       VFT_APP
FILESUBTYPE    0x0
{
  BLOCK "StringFileInfo"
  {
    BLOCK "040904B0"
    {
      VALUE "CompanyName",       "Microsoft Corporation"
      VALUE "FileDescription",   "Paint"
      VALUE "FileVersion",       "10.0.19041.4046 (WinBuild.160101.0800)"
      VALUE "InternalName",      "MSPAINT"
      VALUE "LegalCopyright",    "© Microsoft Corporation. All rights reserved."
      VALUE "OriginalFilename",  "MSPAINT.EXE"
      VALUE "ProductName",       "Microsoft® Windows® Operating System"
      VALUE "ProductVersion",    "10.0.19041.4046"
    }
  }
  BLOCK "VarFileInfo"
  {
    VALUE "Translation", 0x409, 1200
  }
}

0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
20.02.2024, 17:54  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
Вы уверены, что сделали полноценный COM
Я нет, не уверен, как можно быть уверенным в том, что ты не понимаешь, но это не мой пример, это пример из книги того же Петзольда, но это второй пример той же главы.

PUBMEM.rar
CALLPUB.rar

Цитата Сообщение от Ygg Посмотреть сообщение
1) COM нужны апартаменты (apartments), поэтому при полноценной работе с COM вы должны для каждого использующего COM потока вызвать CoInitialize или CoInitializeEx.
В данном случае поток один и CoInitialize вызывается. Апартаменты в смысле некие границы, как у запущенного процесса? Получается CoInitialize это что-то вроде функции создания потока или процесса?

Цитата Сообщение от Ygg Посмотреть сообщение
2) Все COM библиотеки экспортируют одну и ту же предопределённую функцию. Когда возникает необходимость библиотека загружается динамически и с помощью этой функции из неё создаётся нужный объект.
Возможно, в этом и есть проблема так как во вкладке "модули"(visual studio) нет нужной загруженной DLL(PUBMEM.DLL).
Я правильно понял т.е. CoCreateInstance ищет нужный CLSID в реестре, если находит, то загружает нужную .DLL или .EXE та в свою очередь вызывает функцию создания объекта CreateAllocator, которая его создаёь, в данном случае объект - это IMalloc, так? Зачем тогда в этом примере фабрика классов она вообще какую роль играет?

Цитата Сообщение от Ygg Посмотреть сообщение
3) При инсталляции COM-библиотеки в систему в особый раздел реестра прописывается информация связывающая CLSID и имя библиотеки.
Я в реестр ничего не прописывал.

Цитата Сообщение от Ygg Посмотреть сообщение
4) При вызове CoCreateInstance производится поиск в реестре по запрошенному CLSID, находится связанный с CLSID файл-библиотеки, выполняется динамическая загрузка найденной библиотеки, из неё достаётся адрес предопределённой функции и с помощью неё уже производится создание нужного объекта.
Понятно, но чисто теоретически.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
20.02.2024, 17:59  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Вы же только что код библиотеки на си переделывали. Уже передумали и вернулись на си плас плас?
Я делаю так как в книге, а там и Си и С++, это второй пример, а то что я делал в vtbl, это попытка разобраться как это происходит на Си, то что прячем от нас компилятор.

Цитата Сообщение от politoto Посмотреть сообщение
Код причины неудачи, который вернула CoCreateInstance() вы с соавторами положили в hr.
Что там в hr?
REGDB_E_CLASSNOTREG.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
21.02.2024, 08:53
Цитата Сообщение от Liss29 Посмотреть сообщение
Апартаменты в смысле некие границы, как у запущенного процесса? Получается CoInitialize это что-то вроде функции создания потока или процесса?
Да, слово границы подходит для описания. Но это и не аналог потоков или процессов, это скорее границы внутри обычных потоков и процессов. Вообще, тема апартаментов и маршалинга для меня немного мутная, больше теоретическая чем практическая. По жизни мне приходилось пользоваться лишь INPROC_SERVER и мультипоточными апартаментами без заморочек с маршалингом.

Я правильно понял т.е. CoCreateInstance ищет нужный CLSID в реестре, если находит, то загружает нужную .DLL или .EXE та в свою очередь вызывает функцию создания объекта CreateAllocator, которая его создаёь, в данном случае объект - это IMalloc, так? Зачем тогда в этом примере фабрика классов она вообще какую роль играет?
В целом правильно, с небольшими поправками. Объект - это экземпляр класса DMalloc. Любой клиент ничего не знает о CreateAllocator или какой-то другой специфики. Клиенты знают только о DllGetClassObject, которая должна предоставлять фабрику строящую нужные объекты. Так вот принято/решено/ожидаемо, что создание всегда идёт через фабрику.

Я в реестр ничего не прописывал.
В этом и есть проблема, о чём так же говорит код ошибки. Не верю, что автор книги в описании ничего не написал про регистрацию в реестре. Читайте главу к данному примеру. Ещё есть утилита regsrv32, которая может регистрировать библиотеки, но для этого библиотека должна реализовать в себе дополнительные функции DLLRegisterServer и DLLUnregisterServer. По сути, утилита только загружает библиотеку и вызывает эти функции, разработчик должен сам поместить в эти функции работу с реестром. В коде примера этих функций нет, значит предполагается ручной способ заполнения реестра.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
21.02.2024, 09:26
Цитата Сообщение от Liss29 Посмотреть сообщение
вызывает функцию создания объекта CreateAllocator, которая его создаё, в данном случае объект - это IMalloc, так? Зачем тогда в этом примере фабрика классов она вообще какую роль играет?
У фабрики классов есть метод CreateInstance(), который можно рассматривать как виртуальный конструктор (в c++ их нет, но в полностью ОО-системах классы - полноценные объекты, которые можно создавать, передавать как параметры методов других объектов и т.д.) объектов(экземпляров) КоКласса с идентификатором CLSID в том контексте, который задан клиентом в CoCreateInstance() или каким-то другим способом.

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
STDMETHODIMP
CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid,
    LPVOID FAR* ppvObject)
{
    // Initialize return pointer
    *ppvObject = NULL;
 
    // If trying to aggregate, fail
    if (pUnkOuter != NULL)
        return CLASS_E_NOAGGREGATION;
 
    // Create memory allocation object
    LPMALLOC pMalloc = CreateAllocator(); // <<  функция для внутреннего использования компонентом
 
    if (pMalloc == NULL)
    {
        return E_OUTOFMEMORY;
    }
    else
    {
        // Fetch interface requested by caller
        HRESULT hr = pMalloc->QueryInterface(riid, ppvObject);
 
        // Decrement reference count produced by CreateAllocator
        pMalloc->Release();
 
        // Increment count of objects
        if (SUCCEEDED(hr))
            ++cObject;
 
        return hr;
    }
}
Добавлено через 5 минут
Цитата Сообщение от Ygg Посмотреть сообщение
Клиенты знают только о DllGetClassObject, которая должна предоставлять фабрику строящую нужные объекты. Так вот принято/решено/ожидаемо, что создание всегда идёт через фабрику.
Только для тех объектов, которые клиенты могут сами создавать с помощью CoCreateInstanceEx() и аналогов.
https://learn.microsoft.com/ru... instanceex

В объектной модели сервера может быть куча объектов, которые клиенты могут получать у существующих объектов методами публичных интерфейсов, но "сами" создать по CLSID не могут.
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
22.02.2024, 17:27  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
Но это и не аналог потоков или процессов, это скорее границы внутри обычных потоков и процессов.
Это как понять, бывают не обычные потоки и процессы...) Короче говоря чем дальше в лес, тем толще партизаны.

Цитата Сообщение от Ygg Посмотреть сообщение
Клиенты знают только о DllGetClassObject, которая должна предоставлять фабрику строящую нужные объекты.
Видимо, в данном примере так и есть, здесь присутствует фабрика классов, правда жить от этого легче не стало.

Цитата Сообщение от Ygg Посмотреть сообщение
Не верю, что автор книги в описании ничего не написал про регистрацию в реестре.
Почему же он даёт кусок кода, где в реестр добавляется раздел в этот раздел добавляется подраздел, а в него значение, в котором, указано расположение .DLL, правда работает она криво т.к. путь к библиотеке прописывается не полностью, а так раздел и подраздел добавляет. Я пробовал добавлять в реестр с помощью этого кода на виртуалке с windows xp.
Оказалось, что удалить из реестра то, что я туда добавил не такая уж и простая задача, пока что у меня ничего не вышло. Думал создать пункт меню с двумя строками одна будет добавлять значение в реестр, другая строка меню наоборот удалять значение из реестр, но пока что изучаю API для работы с реестром(.

Цитата Сообщение от politoto Посмотреть сообщение
У фабрики классов есть метод CreateInstance()
Да, есть такое. Пока что ясно, что то, что в первом примере было явно использовано в функции окна клиента, теперь запрятано в глубь библиотеки.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
22.02.2024, 23:53
Цитата Сообщение от Liss29 Посмотреть сообщение
Это как понять, бывают не обычные потоки и процессы...) Короче говоря чем дальше в лес, тем толще партизаны.
В COM для объекта вообще нет понятия процесса или потока, а есть апартаменты. Есть ST-апартаменты, а есть MT-апартаменты. ST-апартаменты существуют внутри какого-то потока, MT-апартаменты внутри процессов. Не важно где находится объект, в другом потоке, в другом процессе или на другой машине - COM позволяет вызывать методы интерфейсов прозрачно и единообразно. Каждый процесс может иметь 1 MT-апартамент и несколько ST-апартаментов. Просто так ссылку на интерфейс между двумя ST-апартаментами передавать нельзя - нужно использовать маршалинг.

Цитата Сообщение от Liss29 Посмотреть сообщение
Видимо, в данном примере так и есть, здесь присутствует фабрика классов, правда жить от этого легче не стало.
В COM объект можно создать несколькими способами. Через фабрику классов - только 1 из них.

Цитата Сообщение от Liss29 Посмотреть сообщение
Почему же он даёт кусок кода, где в реестр добавляется раздел в этот раздел добавляется подраздел, а в него значение, в котором, указано расположение .DLL, правда работает она криво т.к. путь к библиотеке прописывается не полностью, а так раздел и подраздел добавляет. Я пробовал добавлять в реестр с помощью этого кода на виртуалке с windows xp.
Оказалось, что удалить из реестра то, что я туда добавил не такая уж и простая задача, пока что у меня ничего не вышло. Думал создать пункт меню с двумя строками одна будет добавлять значение в реестр, другая строка меню наоборот удалять значение из реестр, но пока что изучаю API для работы с реестром(.
Вообще в COM не обязательно регистрировать в реестре компонент, ну если и делать это, то нужно это делать правильно. В подавляющем большинстве случаев достаточно всю информацию разместить в SxS-Reg-Free манифесте.

Цитата Сообщение от Liss29 Посмотреть сообщение
Я правильно понял т.е. CoCreateInstance ищет нужный CLSID в реестре, если находит, то загружает нужную .DLL или .EXE та в свою очередь вызывает функцию создания объекта
Это только один из вариантов. На самом деле вариантов создания объекта - масса.
0
23.02.2024, 00:05  [ТС]

Не по теме:

Хотелось бы узнать, что такое класс подключа(ключа) реестра windows. В функции RegEnumKeyEx есть параметр LPTSTR lpClass и пояснение к данному параметру, но мне не ясно что это за класс и зачем он нужен:

lpClass Адрес буфера, куда функция возвращает имя класса перечисляемого подключа. Этот параметр может быть равен NULL, если класс не требуется.

0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
23.02.2024, 09:35
Цитата Сообщение от The trick Посмотреть сообщение
в COM не обязательно регистрировать в реестре компонент, ну если и делать это, то нужно это делать правильно. В подавляющем большинстве случаев достаточно всю информацию разместить в SxS-Reg-Free манифесте.
В COM или в системах, понимающих подобные манифесты?
XML
1
2
3
4
5
6
7
8
9
<file name="sampleu.dll">
        <comClass description="Font Property Page"
    clsid="{0BE35200-8F91-11CE-9DE3-00AA004BB851}"
          threadingModel = "Both"
             tlbid = "{44EC0535-400F-11D0-9DCD-00A0C90391D3}"/>
        <comClass description="Color Property Page"
    clsid="{0BE35201-8F91-11CE-9DE3-00AA004BB851}" 
    progid="ABC.Registrar"/>
    </file>
https://learn.microsoft.com/ru... om-interop
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
23.02.2024, 12:53
politoto, в COM. Как я написал выше, COM объект можно создать несколькими способами и регистрация в реестре нужна только в некоторых случаях.
0
24.02.2024, 14:16

Не по теме:

Liss29, неизвестно, вроде у всех там пустая строка.

0
25.02.2024, 00:15  [ТС]

Не по теме:

Как удалить добавленный мною ключ из реестра(308D0430-1090-11CF-B92A-00AA006238F8)? Короче говоря можно даже расширить вопрос, как обойти все подключи заданного мною ключа(или просто выбранного ключа)? Если есть добавленный мною ключ, в этот ключ добавлен ещё один под-ключ("InprocServer32") в котором присутствуют значения(данные), если это так, то тут всё просто, в цикле функция RegEnumKeyEx() и можно посмотреть список под ключей в данном ключе реестра, но что делать, если вложенность чуть больше, чем один уровень от нужного ключа? Функция удаления у меня не срабатывает выкидывает ошибку 5 - Отказано в доступе., не знаю в чём дело, открываю ключ так

C++
1
2
3
lError = RegOpenKeyEx(HKEY_CLASSES_ROOT, 
    TEXT("CLSID"), 
    0, KEY_ALL_ACCESS, &hkMain);
Поискав решения в интернете нашёл следующее: ключ, который содержит вложенные подключи удалить нельзя, нужно первоначально удалить подключи, а уже после этого пробовать удалять основной ключ. Тут ещё дело вот в чём, я пробую всё это безобразие на вирт. машине с установленной windows xp, а данная ОС поддерживает не всё функции работы с реестром.

0
25.02.2024, 08:05

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
я пробую всё это безобразие на вирт. машине с установленной windows xp
Для чего такие хитрости?
данная ОС поддерживает не всё функции работы с реестром.
Если верить https://learn.microsoft.com/ru... deletekeya
то данная ОС поддерживает подпрограмму, которая "удаляет подраздел и все его потомки" из реестра.
C
1
2
3
4
LSTATUS SHDeleteKeyA(
  [in]           HKEY   hkey,
  [in, optional] LPCSTR pszSubKey
);
В разделе о реестре есть пример удаления раздела реестра с подразделами без использования RegDeleteTree() и SHDeleteKey():
Кликните здесь для просмотра всего текста
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <windows.h>
#include <stdio.h>
#include <strsafe.h>
 
//*************************************************************
//
//  RegDelnodeRecurse()
//
//  Purpose:    Deletes a registry key and all its subkeys / values.
//
//  Parameters: hKeyRoot    -   Root key
//              lpSubKey    -   SubKey to delete
//
//  Return:     TRUE if successful.
//              FALSE if an error occurs.
//
//*************************************************************
 
BOOL RegDelnodeRecurse (HKEY hKeyRoot, LPTSTR lpSubKey)
{
    LPTSTR lpEnd;
    LONG lResult;
    DWORD dwSize;
    TCHAR szName[MAX_PATH];
    HKEY hKey;
    FILETIME ftWrite;
 
    // First, see if we can delete the key without having
    // to recurse.
 
    lResult = RegDeleteKey(hKeyRoot, lpSubKey);
 
    if (lResult == ERROR_SUCCESS) 
        return TRUE;
 
    lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);
 
    if (lResult != ERROR_SUCCESS) 
    {
        if (lResult == ERROR_FILE_NOT_FOUND) {
            printf("Key not found.\n");
            return TRUE;
        } 
        else {
            printf("Error opening key.\n");
            return FALSE;
        }
    }
 
    // Check for an ending slash and add one if it is missing.
 
    lpEnd = lpSubKey + lstrlen(lpSubKey);
 
    if (*(lpEnd - 1) != TEXT('\\')) 
    {
        *lpEnd =  TEXT('\\');
        lpEnd++;
        *lpEnd =  TEXT('\0');
    }
 
    // Enumerate the keys
 
    dwSize = MAX_PATH;
    lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
                           NULL, NULL, &ftWrite);
 
    if (lResult == ERROR_SUCCESS) 
    {
        do {
 
            *lpEnd = TEXT('\0');
            StringCchCat(lpSubKey, MAX_PATH * 2, szName);
 
            if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
                break;
            }
 
            dwSize = MAX_PATH;
 
            lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
                                   NULL, NULL, &ftWrite);
 
        } while (lResult == ERROR_SUCCESS);
    }
 
    lpEnd--;
    *lpEnd = TEXT('\0');
 
    RegCloseKey (hKey);
 
    // Try again to delete the key.
 
    lResult = RegDeleteKey(hKeyRoot, lpSubKey);
 
    if (lResult == ERROR_SUCCESS) 
        return TRUE;
 
    return FALSE;
}
 
//*************************************************************
//
//  RegDelnode()
//
//  Purpose:    Deletes a registry key and all its subkeys / values.
//
//  Parameters: hKeyRoot    -   Root key
//              lpSubKey    -   SubKey to delete
//
//  Return:     TRUE if successful.
//              FALSE if an error occurs.
//
//*************************************************************
 
BOOL RegDelnode (HKEY hKeyRoot, LPCTSTR lpSubKey)
{
    TCHAR szDelKey[MAX_PATH*2];
 
    StringCchCopy (szDelKey, MAX_PATH*2, lpSubKey);
    return RegDelnodeRecurse(hKeyRoot, szDelKey);
 
}
 
int __cdecl main()
{
   BOOL bSuccess;
 
   bSuccess = RegDelnode(HKEY_CURRENT_USER, TEXT("Software\\TestDir"));
 
   if(bSuccess)
      printf("Success!\n");
   else printf("Failure.\n");
 
   return 0;
}

https://learn.microsoft.com/ru... th-subkeys

0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
25.02.2024, 13:55
Цитата Сообщение от Liss29 Посмотреть сообщение
Как удалить добавленный мною ключ из реестра
Не надо ничего перечислять.
Удаляйте снизу вверх только то что вы туда напихали. Сначала подподразделы, потом подразделы, потом разделы.
А если там есть какие‐то другие ключи, значит это чужое и его не трогайте.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
25.02.2024, 21:37  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Для чего такие хитрости?
В смысле для чего?! Для того чтобы хостовую Ось не убить подобными экспериментами.

Цитата Сообщение от politoto Посмотреть сообщение
Если верить
Если верить, то да, поддерживает, но по факту нет, RegDeleteTree(), например, не поддерживается и приложение ещё до запуска выкидывает ошибку что то вроде ": имя.DLL не содержит такую функцию" или что-то в этом роде.
Да, я знаю про пример на сайте майкрософт, т.к. там рекурсия я его не совсем понимаю(я не врубась, как происходит выход из рекурсии, что происходит. Извлекается адрес функции из стека с локальными параметрами и что дальше... начинает выполняться следующая строчка кода), но мне хотелось бы реализовать его без рекурсии, мне хочется понять и отобразить это в коде, как обойти все ключи и подключи в заданном ключе. Для начала я просто постарался не удалять, а выводить всё это дело, но у меня без рекурсии ничего не вышло. Так что как-то так.

Добавлено через 1 минуту
Цитата Сообщение от Замабувараев Посмотреть сообщение
Удаляйте снизу вверх только то что вы туда напихали. Сначала подподразделы, потом подразделы, потом разделы.
Но последний т.е. первый(CLSID - 308D0430-1090-11CF-B92A-00AA006238F8) добавленный подраздел не удаляется.
1
26.02.2024, 08:50

Не по теме:

Цитата Сообщение от Liss29 Посмотреть сообщение
Для того чтобы хостовую Ось не убить подобными экспериментами.
Разумно.
Хостовая Ось у Вас тоже XP?
Если в Вашей Windows нет ни Песочницы, ни Windows-To-Go, попробуйте установить на виртуальную машину аналогичную хостовой урезанную до минимального по требуемым ресурсам состояния, достаточного для Ваших экспериментов.

Или уж найдите на чердаке Windows 95, чтобы погрузиться в атмосферу книги.

0
26.02.2024, 14:53

Не по теме:

Liss29, согласен, это все надо на виртуалке тестить, чтобы не убить ОС экспериментами. Касаемо реестра - удаляйте вручную или батником, т.к. не надо изучать 2 темы сразу (и реестр, и СОМ). Это будет только отвлекать.

0
26.02.2024, 21:45  [ТС]

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
Или уж найдите на чердаке Windows 95, чтобы погрузиться в атмосферу книги.
Обязательно, прямо сейчас и начну искать.

Цитата Сообщение от Morgot Посмотреть сообщение
Касаемо реестра - удаляйте вручную или батником, т.к. не надо изучать 2 темы сразу (и реестр, и СОМ). Это будет только отвлекать.
Я и не собираюсь погружаться в изучение API для работы с реестром, но и изучение COM особо не продвигается, так что я даже не знаю что лучше в данном случае, а что хуже. Мне нужно реализовать удаление из реестра и всё, на этом работу с реестром я закончу до поры до времени, реализовать не какую-то супер-пуппер универсальную функцию, а простенькую для свих нужд. Но не рекурсивную.)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2024, 21:45

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


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

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
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 и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru