2008-11-12 2 views
9

Мне нужно написать код, который запускается при вызове DllRegisterServer. то есть, когда кто-то звонит:Win32: Записи реестра, необходимые для регистрации элемента управления ActiveX?

regsvr32 myActiveX.ocx 

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

До сих пор мои экспедиции обнаружили:

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»?

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

+1

Я COM-разработчик, новичку один. У меня такой же вопрос. Я хотел бы поделиться с вами [этим] (http://ewall.org/index.php?module=ContentExpress&func=print&ceid=22). – smwikipedia

+0

Не большинство фреймворков автоматизирует создание этого для вас? – Deanna

ответ

5

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

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

- What registry entries are needed to register a COM object.

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

3

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

Также Larry Osterman имеет полезное сообщение в блоге here.


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

0

Обязательно используйте статью Ларри Остермана.

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

5

Найти/взять/украсть копию Inside OLE 2 от Kraig Brockenschmidt. Он старый, как мир (и датирует меня также :-))

Здесь также a high-level overview записей в реестре, упомянутых выше.

Прочитать Larry Osterman's blog post для большего количества указателей.

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

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

0

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

9

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

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

Этот класс затем используется для создания объектов. Теперь COM должен знать, где находится DLL, которая содержит COM-объект. В моем конкретном случае «сервер», который предоставляет объект COM, является DLL и будет «in process». Затем указать 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.

An MSDN article states, что вы должны добавить фиктивный Программируемый ключ, чтобы указать, что элемент управления ActiveX:

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

Но this MSDN Library page говорит ключевое слово управления, а не Программируемая - и есть нет программируемого ключа.

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

Я не могу найти ничего, что бы требовало.

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

+1

«Программируемый» кажется правильным ключом - я не мог загрузить компонент в MSOffice с помощью 'Control' и без' Programmable'. Кроме того, я бы предложил добавить номер версии в 'ProgID' (' MyCoolLibrary.MyCoolControl.1') и сохранить «VersionIndependentProgID» без добавления номера версии. – alecov

-1

Вы работаете над 64-разрядной ОС?

Если да, то вместо того, чтобы писать в
HKEY_CLASSES_ROOT \ CLSID \
вы должны написать
HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID \

Смежные вопросы