Win32: записи реестра, необходимые для регистрации элемента управления ActiveX? - PullRequest
9 голосов
/ 12 ноября 2008

Мне нужно написать код, который запускается при вызове DllRegisterServer. то есть когда кто-то звонит:

regsvr32 myActiveX.ocx

Я пытаюсь найти полный список необходимых записей в реестре (а не только то, что я могу объединить, выполняя заклинание через реестр).

Пока мои экспедиции нашли:

HKEY_CLASSES_ROOT
   \MyCoolLibrary.MyCoolControl
      \Clsid
         (default) = "{myClassId}"
   \CLSID
      \{myClassId}
         \Control
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \MiscStatus
            \1
               (default) = 205201
         \ProgID
            (default) = "MyCoolLibrary.MyCoolControl"
         \ToolboxBitmap32
            (default) = "c:\foo\myActiveX.ocx,1"
         \TypeLib
            (default) = "{myTypeLibraryGuid}"
         \Verb
            \0
               (default) = "Properties,0,2"
         \Version
            (default) = "1.0"
   \TypeLib
      \{myTypeLibraryGuid}
         \1.0
            (default) = "MyCoolLibrary.MyCoolControl"

Теперь проблемы: - что содержит папка Control? Это присутствие указывает на контроль? - что делает MiscStatus 205201? Что бы 205202 сделал вместо этого? - Что такое глагол «Свойства, 0,2»? Где "Свойства, 0,0" и "Свойства, 0,1"?

Другими словами, я ищу документы.

Ответы [ 7 ]

9 голосов
/ 12 ноября 2008

Что я знаю до сих пор. COM создает объект на основе его clsid . Это руководство, которое однозначно идентифицирует этот класс.

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}

Этот класс затем используется для создания объектов. Теперь COM должен знать, где находится DLL, которая содержит этот COM-объект. В моем конкретном случае «сервер», который предоставляет COM-объект, является DLL и будет «в процессе». Затем мы указываем COM на эту "в процессе" DLL, добавив:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"

COM также должен знать модель потоков, поддерживаемую объектом COM-сервера. Самым простым, наиболее распространенным и используемым в этом примере является модель потоков «Квартира»:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"

Далее идет ProgID. Это похоже на то, как DNS используется для превращения понятного имени в IP. Здесь мы превращаем дружественное имя "MyCoolLibrary.MyCoolControl" в уродливый clsid "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

Теперь кто-то может попросить

MyCoolLibrary.MyCoolControl

и COM может превратить это в ClassID

{AE8530CF-D204-4877-9CAB-F052BF1F661F}

Как только COM получает clasid, он может заглянуть в реестр под HKCR\Clsid\{AE8530CF-D204-4877-9CAB-F052BF1F661F}, чтобы найти реальную информацию.

Для забавы, ProgID добавлен в раздел Clsid, просто чтобы люди могли понять, что это за класс:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \ProgID
             (default) = "MyCoolLibrary.MyCoolControl"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

Далее идет библиотека типов. Это в основном un важно для всего, что находится в процессе, но если COM-объект находится в другой «квартире», то параметры функции необходимо маршалировать. COM делает это автоматически для вас, если у него есть библиотека типов, которая определяет все методы классов.

Раздел clsid указывает на соответствующую библиотеку типов с добавлением ключа TypeLib:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \ProgID
             (default) = "MyCoolLibrary.MyCoolControl"
         \TypeLib            
             (default) = "{17A5A3D4-439C-4C2A-8AB4-749B7771CDE1}"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

Информация об этой библиотеке типов также хранится в реестре, но добавление этих ключей сделано для нас с помощью вызова RegisterTypeLib . Но это добавит нам ключи, похожие на:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \ProgID
             (default) = "MyCoolLibrary.MyCoolControl"
         \TypeLib            
             (default) = "{17A5A3D4-439C-4C2A-8AB4-749B7771CDE1}"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"
HKEY_CLASSES_ROOT
    \TypeLib
        \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
           \1.0
              (default) = "My Cool ActiveX Library"
           ...

Теперь мы разберемся со сложными вещами, необходимыми для , надеюсь, , чтобы заставить работать элемент управления ActiveX.

В статье MSDN указано, что необходимо добавить фиктивную Программируемую клавишу , чтобы указать, что это элемент управления ActiveX:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \Programmable

Но на этой странице библиотеки MSDN говорится, что ключевое слово Control , а не Программируемый - и нет программируемой клавиши.

Но это не мешает некоторым ActiveX использовать Control, некоторые используют Programmable, а некоторые - оба.

Я не могу найти ничего, упоминая, что требуется что-то еще.

Итак, кто-нибудь может найти определенную документацию?

5 голосов
/ 12 ноября 2008

Найти / одолжить / украсть копию Inside OLE 2, Крейг Брокеншмидт. Он стар, как мир (и встречается со мной также: -))

Вот также общий обзор записей реестра, упомянутых выше.

Прочтите блог Ларри Остермана , чтобы узнать больше.

Посмотрите на образцы MSDN ActiveX .

Кроме того, вам не хватает записей в HKCR \ Interfaces для всех пользовательских интерфейсов и интерфейсов событий, которые реализует ваш элемент управления.

5 голосов
/ 12 ноября 2008

Ларри Остерман обеспечивает хорошую отправную точку:

Большая часть "культа грузов" Суть этого заключается в том, что там изумительный набор реестра настройки, которые можно установить для COM объекты, и не ясно, какие, если любое применимо. Поэтому я пытаюсь заложить из серии статей, которые могут помочь люди определяют, что им нужно установлен.

- Какие записи реестра необходимы для регистрации COM-объекта.

Резюме: это зависит от того, в каких сценариях вам нужно использовать ваш объект. Самыми основными, абсолютно необходимыми настройками являются значение по умолчанию и ThreadingModel в HKEY_CLASSES_ROOT\CLSID\<clsid>\, но в большинстве случаев вам нужны ProgID и AppID а также.

3 голосов
/ 12 ноября 2008

Это не исчерпывающее, но попробуйте эту статью базы знаний MS.

Также, Ларри Остерман имеет полезную запись в блоге здесь .


Мне приходит в голову, что другим подходом было бы использовать инструмент, подобный RegMon , и напрямую отслеживать, какие изменения реестра вносятся при вызове вашего метода DllRegisterServer.

0 голосов
/ 19 марта 2013

Вы работаете на 64-битной ОС?

Если это так, вместо записи в
HKEY_CLASSES_ROOT \ CLSID \
вы должны написать
HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID \

0 голосов
/ 12 ноября 2008

Дополнительное примечание, если вы хотите экспериментально увидеть, какие ключи создаются: используйте Sysinternals ' Process Monitor , он будет в реальном времени регистрировать активность в реестре при регистрации элемента управления.

0 голосов
/ 12 ноября 2008

Во что бы то ни стало, воспользуйтесь ссылкой на статью Ларри Остермана.

Кроме того, хорошей отправной точкой являются сценарии регистратора ATL, сгенерированные мастером COM-объектов MSVC ATL. Вы можете играть с различными опциями и посмотреть, как они влияют на вывод.

...