winapi - punto - Win32: ¿Se requieren entradas de registro para registrar un control ActiveX?
regsvr32 no se encontro el punto de entrada (7)
Necesito escribir el código que se ejecuta cuando se llama a DllRegisterServer. es decir, cuando alguien llama:
regsvr32 myActiveX.ocx
Estoy tratando de encontrar la lista definitiva de las entradas de registro necesarias (en lugar de solo lo que puedo improvisar mediante hechizos a través del registro).
Hasta el momento mis expediciones han encontrado:
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"
Ahora, las preocupaciones: - ¿Qué contiene la carpeta Control? ¿Su presencia indica un control? - ¿Qué es un MiscStatus de 205201? ¿Qué haría 205202 en su lugar? - ¿Cuál es el verbo "Propiedades, 0,2"? ¿Dónde están "Propiedades, 0,0" y "Propiedades, 0,1"?
En otras palabras, estoy buscando los documentos.
¿Estás trabajando en un sistema operativo de 64 bits?
Si es así, en lugar de escribir para
HKEY_CLASSES_ROOT / CLSID /
debes escribir a
HKEY_CLASSES_ROOT / Wow6432Node / CLSID /
Encuentra / presta / roba una copia de Inside OLE 2, por Kraig Brockenschmidt. Es viejo como el mundo (y me sale también :-))
Aquí también hay una descripción general de alto nivel de las entradas de registro mencionadas anteriormente.
Lea la publicación de blog de Larry Osterman para obtener más sugerencias.
Mire los ejemplos de MSDN ActiveX .
Además, le faltan entradas en HKCR / Interfaces para todas las interfaces personalizadas e interfaces de eventos que implementa su control.
Larry Osterman proporciona un buen punto de partida:
Una gran parte de la naturaleza de "culto a la carga" de esto es el hecho de que hay un conjunto desconcertante de configuraciones de registro que se pueden establecer para los objetos COM, y no está claro cuál, si corresponde. Así que estoy tratando de diseñar una serie de artículos que pueden ayudar a las personas a determinar lo que necesitan establecer.
- Qué entradas de registro son necesarias para registrar un objeto COM.
Resumen: depende de los escenarios en los que necesite que se use su objeto. La configuración más básica y absolutamente necesaria es el valor predeterminado y ThreadingModel en HKEY_CLASSES_ROOT/CLSID/<clsid>/
, pero la mayoría de las veces querrá ProgIDs. y AppIDs también.
Lo que sé hasta ahora. COM crea un objeto basado en su clsid . Esta es una guía que identifica de manera única a esa clase.
HKEY_CLASSES_ROOT
/Clsid
/{AE8530CF-D204-4877-9CAB-F052BF1F661F}
Esa clase luego se usa para crear objetos. COM ahora necesita saber dónde está el DLL que contiene ese objeto COM. En mi caso particular, el "servidor" que expone el objeto COM es una DLL, y estará "en proceso". A continuación, señalamos COM a esa dll "en proceso" agregando:
HKEY_CLASSES_ROOT
/Clsid
/{AE8530CF-D204-4877-9CAB-F052BF1F661F}
/InprocServer32
(default) = "c:/foo/myActiveX.ocx"
COM también necesita conocer el modelo de subprocesamiento compatible con el objeto de servidor COM. El más simple, más común y el que se usa en este ejemplo es el modelo de subprocesamiento "Apartamento":
HKEY_CLASSES_ROOT
/Clsid
/{AE8530CF-D204-4877-9CAB-F052BF1F661F}
/InprocServer32
(default) = "c:/foo/myActiveX.ocx"
ThreadingModel = "Apartment"
El siguiente es el ProgID. Esto es similar a cómo se usa DNS para convertir un nombre descriptivo en un IP. Aquí convertimos un nombre "MyCoolLibrary.MyCoolControl"
en el feo 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}"
Ahora alguien puede pedir
MyCoolLibrary.MyCoolControl
y COM puede convertir eso en ClassID
{AE8530CF-D204-4877-9CAB-F052BF1F661F}
Una vez que COM tiene el clasid, puede buscar en el registro en HKCR/Clsid/{AE8530CF-D204-4877-9CAB-F052BF1F661F}
para encontrar la información real.
Para divertirse, el ProgID se agrega a la sección Clsid, para que la gente pueda tener una idea de lo que es esta clase:
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}"
El siguiente es la biblioteca de tipos. Esto no es importante para nada en el proceso, pero si el objeto COM está en otro "departamento", entonces los parámetros de la función deben ser coordinados. COM hace esto automáticamente si tiene una biblioteca de tipos que define todos los métodos de clases.
La sección clsid apunta a la biblioteca de tipos apropiada con la adición de una clave 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}"
La información sobre esta biblioteca de tipos también se almacena en el registro, pero al agregar estas claves se realiza una llamada a RegisterTypeLib . Pero agregará claves para nosotros similares a:
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"
...
Ahora entramos en las cosas complicadas, cosas que se necesitan para hacer funcionar un control ActiveX.
Un artículo de MSDN indica que debe agregar una clave programable ficticia para indicar que es un control ActiveX:
HKEY_CLASSES_ROOT
/Clsid
/{AE8530CF-D204-4877-9CAB-F052BF1F661F}
/Programmable
Pero esta página de MSDN Library dice que la palabra clave es Control , y no Programable , y no hay ninguna tecla programable.
Pero eso no impide que algunos ActiveX usen Control, algunos usan Programable y otros usan ambos.
No puedo encontrar nada mencionando que se requiera nada más.
Entonces, ¿alguien puede encontrar alguna documentación definitiva?
No es exhaustivo, pero prueba este artículo de la base de conocimiento de MS.
Además, Larry Osterman tiene una publicación de blog útil aquí .
Se me ocurre que otro enfoque sería usar una herramienta como RegMon y supervisar directamente qué cambios de registro se realizan cuando se llama al método DllRegisterServer.
Nota al pie si quiere ver experimentalmente qué claves se crean: use el Monitor de procesos de Sysinternals, capturará en tiempo real la actividad en el registro cuando registre el control.
Por supuesto, vaya con el artículo de Larry Osterman vinculado.
Además, un buen punto de partida son los scripts de registro de ATL generados por el asistente de objetos COM de MSVC ATL. Puedes jugar con diferentes opciones y ver cómo afectan la salida.