Что я знаю до сих пор. 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, а некоторые - оба.
Я не могу найти ничего, упоминая, что требуется что-то еще.
Итак, кто-нибудь может найти определенную документацию?