Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2012, 22:44   #1
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию И снова COM....

Доброго времени суток. Продолжаю изучать COM и опять наткнулся на непонятку.

Есть функция для регистрации компонента в реестре
Код:
STDAPI DllRegisterServer()
{
}
При регистрации и удаления компонента из реестра должны использоваться функции:

RegOpenKeyEx
RegCreateKeyEx
RegSetValueEx
RegEnumKeyEx
RegDeleteKey
RegCloseKey


Вопрос:
Как реализовать саморегистрацию компонента?

Знаю только что нужно:
1. Описать модуля DLL (я так понял эт: DLL = ::LoadLibrary(...) )
2. Дружественное имя компонента (я так понял это имя, которое я буду видеть в реестре и задаю я)
3. Независящее от версий ProgID (тож задаю я)
4. ProgID (аналогично верхнему)
5. CLSID (вот это я хз откуда брать если компонент еще не зарегился)

В примере видел функцию регистрации:

Код:
HINSTANCE DLL;
g_szFriendName[] = "Inside COM";
g_szVersionProgID[] = "InsideCom.Chap07";
g_szProgID[] = "InsideCom.Chap07.1";

STDAPI DllRegisterServer()
{
      return RegisterServer(DLL,CLSID_Component1,
                                   g_szFriendName,g_szVersionProgID,g_szProgID);
}
Сколько перечитывал главу так и не нашел определения функции RegisterServer и не нашел инициализации и объявления CLSID_Component1
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 21.07.2012, 22:45   #2
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Я там пропустил много кода, просто пример на страниц 4. Но я пересмотрел всё и не нашел что нужно. Заметил что есть #include "Registery.h" только вот самое главное, его реализацию, не написали. Я думаю что всё что я не нашел видать как раз в этом ашнике. Если это так, то тогда как реализовать это всё
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 21.07.2012 в 22:49.
kineziz вне форума Ответить с цитированием
Старый 22.07.2012, 10:44   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от kineziz Посмотреть сообщение
Вопрос:
Как реализовать саморегистрацию компонента?

Сколько перечитывал главу так и не нашел определения функции RegisterServer и не нашел инициализации и объявления CLSID_Component1
Прописать что нужно и куда нужно в реестр.
Та самая функция скорее всего именно это и делает.
CLSID_Component1 это CLSID вашего компонента - сами и определяйте. Это должно лежать в .h файле, через который потом пользователи будут создавать ваш класс.

Вот чтиво для начала: http://blogs.msdn.com/b/larryosterma...05/509731.aspx
waleri вне форума Ответить с цитированием
Старый 22.07.2012, 15:22   #4
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

ага понятно только не понятно как реализовать эту функцию.

Я так понял нужно:

1. Создать раздел в HKEY_CLASSES_ROOT\\ProgID
char ProgID[] = "Component.Com.1" - надеюсь правильно(там ведь почти любое можно)
2. Создаем подраздел с именем CLSID
3. Записываем туда значение. В данном случае значение это CLSID компонента(класса)
4. Создаем подраздел в HKEY_CLESSES_ROOT\\CLSID\\ с именем CLSID нашего компонента (класса)
5. Создаем еще 1 подраздел InprocServer32
6. Туда записываем путь по которому расположено DLL

Чтение.

1. Переходим в раздел с InpocServer32 нашего компонента. Считываем оттуда путь.
2. Загружаем DLL по этому пути.

Похоже так.

Только вот проблема с чтением данных:

Код:
PBYTE *Buffer = new BYTE[22];
DWORD Type = 0;
DWORD SizeBuffer = 22;
//Открываем определенный раздел

//Читаем значение
RegQueryValueEx(KEY,"Имя параметра",0,&Type,Buffer,&SizeBuffer);
потом когда читаю данные они выводятся через пробел т.е.
В реестре я создал запись "Record",считывается нормально а вот когда вывожу его:

Код:
for(int i = 0; i < 22; i++)
     cout << Buffer[i];
Выводит R e c o r d. Вот как от этого избавится

Подскажите как от пробелов при выводе избавится.
Записываются ли ненужные пробелы в переменную Buffer (думаю да)
Правильно ли я построил алгоритм регистрации компонента(класса)
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 22.07.2012 в 15:26.
kineziz вне форума Ответить с цитированием
Старый 22.07.2012, 17:44   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Запустите regedit.exe и посмотрите на другие елементы.
Пробеллы скорее всего изза того, что стринг в unicode формате.
Чтение делать не надо - зачем самому грузить свой же DLL. Если нужно создать объект, для этого есть CoCreateInstance() - DLL будет грузиться автоматически.
Лучше сначала научится пользоваться COM-ом, потом писать компоненты.
Начинать можно с http://en.wikipedia.org/wiki/Component_Object_Model и далее по ссылкам.
waleri вне форума Ответить с цитированием
Старый 22.07.2012, 20:53   #6
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Спасибо. И последний вопрос. В COM объекте можно не писать фабрику объектов. Или это обязательное условие, которое должно быть в каждом COM. Вроде когда я учился их писать они и без нее отлично работали
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 22.07.2012, 23:10   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Увы, без этого нельзя. DllGetClassObject всегда должен возвращать IClassFactory. Если надо создавать много объектов одного типа так получается намного быстрее.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Снова и снова. ladose Общие вопросы Delphi 1 11.04.2012 03:37
и снова С++ ltony Помощь студентам 5 04.02.2012 02:16
и снова LPCWSTR Farrel Общие вопросы C/C++ 1 04.10.2010 09:07
и снова assembler Alex74 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 28.01.2010 12:47
MDIChild снова и снова... Siber_Dec Общие вопросы Delphi 2 13.12.2009 03:24