Uso de controles ActiveX y COM en Qt
El módulo QAxContainer forma parte del framework ActiveQt. Proporciona una biblioteca que implementa una subclase de QWidget, QAxWidget, que actúa como contenedor de controles ActiveX, y una subclase de QObject, QAxObject, que puede utilizarse para acceder fácilmente a objetos COM no visuales. La programación de objetos COM incrustados mediante estas clases es posible a través de las clases QAxScript, QAxScriptManager y QAxScriptEngine, y un conjunto de herramientas facilita el acceso a objetos COM mediante programación.
El módulo consta de seis clases
- QAxBase es una clase abstracta que proporciona una API para inicializar y acceder a un objeto COM o control ActiveX.
- QAxObject es un QObject que envuelve un objeto COM.
- QAxWidget es un QWidget que envuelve un control ActiveX.
- QAxScriptManager QAxScript y proporcionan una interfaz para el Script Host de Windows. QAxScriptEngine
Se proporcionan algunas aplicaciones de ejemplo que utilizan controles ActiveX estándar para proporcionar una funcionalidad de interfaz de usuario de alto nivel.
Uso de la biblioteca
Para crear aplicaciones Qt que puedan alojar objetos COM y controles ActiveX, enlace la aplicación con el módulo QAxContainer añadiendo
QT += axcontainer
al archivo .pro de su aplicación.
Distribución de aplicaciones QAxContainer
La biblioteca QAxContainer es estática, por lo que no es necesario redistribuir ningún archivo adicional cuando se utiliza este módulo. Tenga en cuenta, no obstante, que los binarios del servidor ActiveX que utilice podrían no estar instalados en el sistema de destino, por lo que deberá enviarlos con su paquete y registrarlos durante el proceso de instalación de su aplicación.
Instanciación de objetos COM
Para instanciar un objeto COM utilice la API QAxBase::setControl(), o pase el nombre del objeto directamente al constructor de la subclase QAxBase que esté utilizando.
El control puede especificarse en varios formatos, pero el más rápido y potente es utilizar directamente el ID de clase (CLSID) del objeto. El ID de clase puede ir precedido de información sobre una máquina remota en la que debería ejecutarse el objeto, y puede incluir una clave de licencia para los controles con licencia.
Mensajes de error típicos
ActiveQt imprime mensajes de error en la salida de depuración cuando encuentra situaciones de error en tiempo de ejecución. Normalmente debe ejecutar su programa en el depurador para ver estos mensajes (por ejemplo, en la salida de depuración de Visual Studio).
No se ha podido instanciar el control solicitado
El control solicitado en QAxBase::setControl() no está instalado en este sistema, o no es accesible para el usuario actual.
El control puede requerir derechos de administrador o una clave de licencia. Si el control tiene licencia, pase la clave de licencia a QAxBase::setControl como se documenta.
Acceso a la API de objetos
ActiveQt proporciona una API Qt al objeto COM, y sustituye los tipos de datos COM por equivalentes Qt.
Hay cuatro formas de llamar a las APIs del objeto COM:
- Generando un espacio de nombres C
- Llamada por nombre
- A través de un motor de scripts
- Utilizando las interfaces COM nativas
Generación de un espacio de nombres C
Para generar un espacio de nombres C++ para la biblioteca de tipos a la que desea acceder, utilice la herramienta dumpcpp. Ejecute esta herramienta manualmente en la biblioteca de tipos que desee utilizar, o intégrela en el sistema de compilación añadiendo las bibliotecas de tipos a la variable TYPELIBS en el archivo .pro de su aplicación:
TYPELIBS = file.tlb
Ten en cuenta que dumpcpp podría no ser capaz de exponer todas las APIs de la biblioteca de tipos.
Incluye el archivo de cabecera resultante en tu código para acceder a las APIs de objetos a través de las clases C++ generadas. Consulte el ejemplo Qutlook para obtener más información.
Llamada por nombre
Utilice QAxBase::dynamicCall() y QAxBase::querySubObject() así como las APIs QObject::setProperty() y QObject::property() para llamar a los métodos y propiedades del objeto COM a través de su nombre. Utilice la herramienta dumpdoc para obtener la documentación de la API de Qt para cualquier objeto COM y sus subobjetos; tenga en cuenta que es posible que no todas las API del objeto COM estén disponibles.
Llamada a una función a través de un motor de scripts
Una aplicación Qt puede alojar cualquier motor ActiveScript instalado en el sistema. El motor de secuencias de comandos puede ejecutar código de secuencias de comandos que acceda a los objetos COM.
Para instanciar un motor de scripts, utilice QAxScriptManager::addObject() para registrar los objetos COM a los que desea acceder desde script, y QAxScriptManager::load() para cargar el código script en el motor. A continuación, llame a las funciones de script utilizando QAxScriptManager::call() o QAxScript::call().
Qué APIs del objeto COM están disponibles a través de scripts depende del lenguaje de script utilizado.
El contenedor de prueba ActiveX muestra la carga de archivos de script.
Llamada a una función mediante las interfaces COM nativas
Para llamar a funciones del objeto COM a las que no se puede acceder mediante ninguno de los métodos anteriores, es posible solicitar directamente la interfaz COM utilizando QAxBase::queryInterface(). Para obtener una definición C++ de las respectivas clases de interfaz utilice la directiva #import con la biblioteca de tipos suministrada con el control; consulte el manual de su compilador para más detalles.
Mensajes de error típicos
ActiveQt imprime mensajes de error en la salida de depuración cuando encuentra situaciones de error en tiempo de ejecución. Normalmente debe ejecutar su programa en el depurador para ver estos mensajes (por ejemplo, en la salida de depuración de Visual Studio).
QAxBase::internalInvoke: No such method
Un QAxBase::dynamicCall() falló - el prototipo de la función no coincidía con ninguna función disponible en la API del objeto.
Error al llamar al miembro IDispatch: Falta un parámetro no opcional
A QAxBase::dynamicCall() falló - el prototipo de la función era correcto, pero se proporcionaron muy pocos parámetros.
Error al llamar al miembro IDispatch: Error de tipo en el parámetro n
A QAxBase::dynamicCall() falló - el prototipo de la función era correcto, pero el parámetro en el índice n era del tipo incorrecto y no pudo ser coercionado al tipo correcto.
QAxScriptManager::call(): No script provides this function
Intentas llamar a una función que se proporciona a través de un motor que no proporciona introspección (es decir, ActivePython o ActivePerl). Debe llamar a la función directamente en el objeto QAxScript correspondiente.
Véase también ActiveQt Framework.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.