QAxFactory 类
QAxFactory 类定义了一个 COM 组件的工厂。 更多...
头文件 | #include <QAxFactory> |
CMake | find_package(Qt6 REQUIRED COMPONENTS AxServer) target_link_libraries(mytarget PRIVATE Qt6::AxServer) |
qmake | QT += axserver |
继承 | QObject |
公共类型
枚举 | ServerType { 单例, 多实例 } |
公共函数
QAxFactory(const QUuid &libid, const QUuid &appid) | |
虚拟 | ~QAxFactory() 覆盖重载 |
虚拟 QUuid | appID() const |
虚拟 QUuid | classID(const QString &key) const |
虚拟 QObject * | createObject(const QString &key) = 0 |
虚拟 bool | createObjectWrapper(QObject *object, IDispatch **wrapper) |
虚拟 QUuid | eventsID(const QString &key) const |
虚拟 QString | exposeToSuperClass(const QString &key) const |
虚拟 QStringList | featureList() const = 0 |
虚拟 bool | hasStockEvents(const QString &key) const |
虚拟 QUuid | interfaceID(const QString &key) const |
虚拟 bool | isService() const |
虚拟 const QMetaObject * | metaObject(const QString &key) const = 0 |
虚拟 void | registerClass(const QString &key, QSettings *settings) const |
虚拟 bool | stayTopLevel(const QString &key) const |
虚拟 QUuid | typeLibID() const |
虚拟 void | unregisterClass(const QString &key, QSettings *settings) const |
虚拟 bool | validateLicenseKey(const QString &key, const QString &licenseKey) const |
静态公共成员
bool | isServer() |
bool | registerActiveObject(QObject *object) |
QString | serverDirPath() |
QString | serverFilePath() |
bool | startServer(QAxFactory::ServerType type = MultipleInstances) |
bool | stopServer() |
宏定义
QAXCLASS(Class) | |
QAXFACTORY_BEGIN(IDTypeLib, IDApp) | |
QAXFACTORY_END | |
QAXFACTORY_EXPORT(Class, LibID, AppID) | |
QAXTYPE(Class) |
详细介绍详细信息
将这个工厂方法在您的COM服务器中实现一次,以提供服务器可以创建的组件信息。派生自QAxFactory并根据任何实现文件(例如main.cpp)实现纯虚函数,并使用QAXFACTORY_EXPORT()
宏导出工厂。
QStringList ActiveQtFactory::featureList() const { QStringList list; list << "ActiveX1"; list << "ActiveX2"; return list; } QObject *ActiveQtFactory::createObject(const QString &key) { if (key == "ActiveX1") return new ActiveX1(parent); if (key == "ActiveX2") return new ActiveX2(parent); return 0; } const QMetaObject *ActiveQtFactory::metaObject(const QString &key) const { if (key == "ActiveX1") return &ActiveX1::staticMetaObject; if (key == "ActiveX2") return &ActiveX2::staticMetaObject; } QUuid ActiveQtFactory::classID(const QString &key) const { if (key == "ActiveX1") return "{01234567-89AB-CDEF-0123-456789ABCDEF}"; ... return QUuid(); } QUuid ActiveQtFactory::interfaceID(const QString &key) const { if (key == "ActiveX1") return "{01234567-89AB-CDEF-0123-456789ABCDEF}"; ... return QUuid(); } QUuid ActiveQtFactory::eventsID(const QString &key) const { if (key == "ActiveX1") return "{01234567-89AB-CDEF-0123-456789ABCDEF}"; ... return QUuid(); } QAXFACTORY_EXPORT( ActiveQtFactory, // factory class "{01234567-89AB-CDEF-0123-456789ABCDEF}", // type library ID "{01234567-89AB-CDEF-0123-456789ABCDEF}" // application ID )
如果您使用Q_CLASSINFO()
宏来提供类的唯一标识符或其他属性,您可以使用QAXFACTORY_BEGIN()
、QAXCLASS()
和QAXFACTORY_END()
宏来将一个或多个类公开为COM对象。
QAXFACTORY_BEGIN( "{01234567-89AB-CDEF-0123-456789ABCDEF}", // type library ID "{01234567-89AB-CDEF-0123-456789ABCDEF}" // application ID ) QAXCLASS(Class1) QAXCLASS(Class2) QAXFACTORY_END()
ActiveX服务器应用程序可能只有一个QAxFactory实现被实例化和导出。此实例可通过全局qAxFactory()函数访问。
工厂还可以重新实现registerClass()和unregisterClass()函数来在注册表中设置ActiveX控件的其他标志。要限制控件类从其父类公开的方法或属性的数量,实现exposeToSuperClass()。
另请参阅QAxAggregated、QAxBindable 和 ActiveQt 框架。
成员类型文档
枚举 QAxFactory::ServerType直接链接到此处
此枚举指定可以使用startServer启动的不同类型的服务器。
常量 | 值 | 描述 |
---|---|---|
QAxFactory::SingleInstance | 0 | 服务器进程只能为每个导出类创建一个实例。COM为每个请求启动一个新的进程。这在仅导出单个可创建类的服务器中使用。 |
QAxFactory::MultipleInstances | 1 | 服务器可以为每个导出类创建多个实例。默认情况下。所有实例都将在同一个线程中生活,并将共享静态资源。 |
成员函数文档
QAxFactory::QAxFactory(const QUuid &libid, const QUuid &appid)直接链接到此处
构造一个QAxFactory对象,在相应接口函数的实现中返回libid和appid。
[重写虚函数 noexcept]
QAxFactory::~QAxFactory()直接链接到此处
销毁QAxFactory对象。
[虚拟]
QUuid QAxFactory::appID() const直接链接到此处
重写此函数以返回ActiveX服务器应用程序标识符。
[虚拟]
QUuid QAxFactory::classID(const QString &key) const直接链接到此处
重写此函数以返回featureList()实现返回的每个key的类标识符,或者如果在工厂中不支持key的值,则返回一个空的QUuid。
默认实现将key解释为类名,并返回Q_CLASSINFO()条目"ClassID"的值。
[纯虚函数]
QObject *QAxFactory::createObject(const QString &key)
重写此函数以返回对应的对象,或返回0表示此工厂不支持该key值。
如果返回的对象是QWidget,它将被暴露为ActiveX控件,否则返回的对象将被作为简单的COM对象暴露。
[虚函数]
bool QAxFactory::createObjectWrapper(QObject *object, IDispatch **wrapper)
重写此函数以在wrapper中提供object的COM对象。如果函数成功返回true;否则返回false。
默认实现将基于object的元对象信息创建一个通用的自动化wrapper。
[虚函数]
QUuid QAxFactory::eventsID(const QString &key) const
重写此函数以返回由featureList()实现返回的每个key的事件接口标识符,如果此工厂不支持该key值,则返回空的QUuid。
默认实现将key解释为类名,并返回Q_CLASSINFO()条目"EventsID"的值。
[虚函数]
QString QAxFactory::exposeToSuperClass(const QString &key) const
重写此函数以返回应该由ActiveX控件暴露的关键字的方法和属性的上层类的名称。
默认实现将key解释为类名,并返回Q_CLASSINFO()条目"Q_CLASSINFO"的值。如果没有设置这样的值,则返回null字符串,并暴露包括QWidget在内的所有上层类的函数和属性。
为了仅暴露本类的函数和属性,请重写此函数以返回key。
[纯虚函数]
QStringList QAxFactory::featureList() const
重写此函数以返回由此工厂支持的控件列表(类名)。
[虚函数]
bool QAxFactory::hasStockEvents(const QString &key) const
重写此函数以返回true,如果ActiveX控件key应支持标准ActiveX事件。
- 点击
- 双击
- 按键下
- 按键压
- 按键抬
- 鼠标下
- 鼠标上
- 鼠标移动
默认实现将key解释为类名,并根据Q_CLASSINFO()条目"StockEvents"为"yes"时返回true。否则此函数返回false。
[虚拟]
QUuid QAxFactory::interfaceID(const QString &key) const
重新实现此函数以返回由 featureList() 实现返回的每个 key 的接口标识符,或者当此工厂不支持 key 的值时返回一个空的 QUuid。
默认实现在将 key 解释为类名后,返回 Q_CLASSINFO() 条目 "InterfaceID" 的值。
[静态]
bool QAxFactory::isServer()
如果应用程序已作为 ActiveX 服务器启动(由 COM),则返回 true,否则返回 false。
int main(int argc, char *argv[]) { QApplication app(argc, argv); if (!QAxFactory::isServer()) { // initialize for stand-alone execution } return app.exec(); }
[虚拟]
bool QAxFactory::isService() const
重新实现此函数以返回服务器作为持久服务(例如 NT 服务)运行时为 true,即使已经释放了提供的所有对象也不应终止。
默认实现返回 false。
[纯虚]
const QMetaObject *QAxFactory::metaObject(const QString &key) const
重新实现此函数以返回与 key 相关的 QMetaObject,或当此工厂不支持 key 的值时返回 0。
[静态]
bool QAxFactory::registerActiveObject(QObject *object)
将 QObject object 在 COM 中注册为运行对象,并在注册成功时返回 true,否则返回 false。当对象被销毁时,将自动取消注册。
仅在用户(即不是由 COM 响应请求)启动应用程序时调用此函数,并且通常只能为应用程序对象层次结构中的顶级对象。
如果对象的 "RegisterObject" 类信息未设置为 "yes",或服务器是进程内服务器,则此函数什么都不做并返回 false。
[虚拟]
void QAxFactory::registerClass(const QString &key, QSettings *settings) const
使用 settings 对象在系统注册表中注册类 key 的附加值。框架已经注册了标准值,但可以通过此函数的实现添加附加值,例如实现类别。
settings->setValue("/CLSID/" + classID(key) + "/Implemented Categories/" + "/{00000000-0000-0000-000000000000}/.", QString());
如果您重新实现此函数,还必须重新实现 unregisterClass() 以删除附加注册值。
另请参阅QSettings。
[静态]
QString QAxFactory::serverDirPath()
返回包含服务器二进制文件的目录。
对于进程外服务器,此目录与 QCoreApplication::applicationDirPath() 相同。对于进程内服务器,该函数返回包含托管应用程序的目录。
[静态]
QString QAxFactory::serverFilePath()
返回服务器可执行文件的文件路径。
对于进程外服务器,这和 QCoreApplication::applicationFilePath() 是一样的。对于进程内服务器,该函数返回宿主应用程序的文件路径。
[静态]
bool QAxFactory::startServer(QAxFactory::ServerType type = MultipleInstances)
以 type 参数启动 COM 服务器,如果成功则返回 true,否则返回 false。
如果服务器已经运行(或对于进程内服务器),调用此函数不执行任何操作并返回 true。
如果使用带 -activex
命令行参数启动服务器可执行文件,则自动以 type 设置为 MultipleInstances
的方式启动服务器。要切换到 SingleInstance,请在您的 main() 入口函数中调用
if (QAxFactory::isServer()) { QAxFactory::stopServer(); QAxFactory::startServer(QAxFactory::SingleInstance); }
。
[虚函数]
bool QAxFactory::stayTopLevel(const QString &key) const
重新实现此函数以返回 true,如果 ActiveX 控件 key 应该是一个顶级窗口,例如一个对话框。默认实现返回 false。
[静态]
bool QAxFactory::stopServer()
停止 COM 服务器并返回 true 如果成功,否则返回 false。
如果服务器未运行(或对于进程内服务器),调用此函数不执行任何操作并返回 true。
停止服务器不会使现有对象无效,但无法从现有服务器进程创建新的对象。通常 COM 会启动一个新的服务器进程,如果有额外的对象请求。
当 main() 函数返回时,服务器会自动停止。
[虚函数]
QUuid QAxFactory::typeLibID() const
重新实现此函数以返回 ActiveX 服务器的类型库标识符。
[虚函数]
void QAxFactory::unregisterClass(const QString &key, QSettings *settings) const
使用 settings 对象从系统注册表中注销类 key 的任何额外值。
settings->remove("/CLSID/" + classID(key) + "/Implemented Categories" + "/{00000000-0000-0000-000000000000}/.");
另请参阅registerClass() 和 QSettings.
[虚函数]
bool QAxFactory::validateLicenseKey(const QString &key, const QString &licenseKey) const
重新实现此函数以返回 true,如果 licenseKey 是类 key 的有效许可证,或者当前机器已获得授权。
默认实现返回 true,如果类 key 未授权(即没有 Q_CLASSINFO()
属性 "LicenseKey"),或者如果 licenseKey 与 "LicenseKey" 属性的值匹配,或者通过与该 COM 服务器具有相同文件名的 .LIC 文件授权了机器。
宏文档
QAXCLASS(Class)
此宏向使用宏 QAXFACTORY_BEGIN() 声明的 QAxFactory 添加一个可创建的 COM 类 Class。
另请参阅 QAXFACTORY_BEGIN()、QAXTYPE()、QAXFACTORY_END() 以及 Q_CLASSINFO()。
QAXFACTORY_BEGIN(IDTypeLib, IDApp)
此宏可用于通过隐式声明的 QAxFactory 实现导出多个 QObject 类。所有 QObject 类都必须通过宏 Q_CLASSINFO() 声明 ClassID、InterfaceID 和 EventsID(如有必要)。所有声明都将包含在 ID 为 IDTypeLib 的类型库中,如果服务器是可执行服务器,则它将具有应用程序 ID IDApp。
需与宏 QAXCLASS()、QAXTYPE() 和 QAXFACTORY_END() 一起使用。
QAXFACTORY_BEGIN( "{01234567-89AB-CDEF-0123-456789ABCDEF}", // type library ID "{01234567-89AB-CDEF-0123-456789ABCDEF}" // application ID ) QAXCLASS(Class1) QAXCLASS(Class2) QAXFACTORY_END()
QAXFACTORY_END
完成使用宏 QAXFACTORY_BEGIN() 开始的 QAxFactory 声明。
另请参阅 QAXFACTORY_BEGIN()、QAXCLASS() 和 QAXTYPE()。
QAXFACTORY_EXPORT(Class, LibID, AppID)
此宏可用于从 COM 服务器导出 QAxFactory 实现的 Class。所有声明都将包含在 ID 为 LibID 的类型库中,如果服务器是可执行服务器,则它将具有应用程序 ID AppID。
QAXFACTORY_EXPORT( MyFactory, // factory class "{01234567-89AB-CDEF-0123-456789ABCDEF}", // type library ID "{01234567-89AB-CDEF-0123-456789ABCDEF}" // application ID )
另请参阅 QAXFACTORY_BEGIN()。
QAXTYPE(Class)
此宏将不可创建的 COM 类 Class 添加到使用宏 QAXFACTORY_BEGIN() 声明的 QAxFactory。该类 Class 可用于通过 QAXTYPE() 或 QAXCLASS 导出的其他 COM 类的 API 中。
类型 Class 的实例只能通过已实例化对象的 API 获取。
另请参阅 QAXFACTORY_BEGIN()、QAXCLASS()、QAXFACTORY_END() 以及 Q_CLASSINFO()。
© 2024 The Qt Company Ltd. 本文档中的贡献版权属于其各自的所有者。本文档是根据自由软件基金会发布的第 1.3 版 GNU 自由文档许可证 许可的。Qt 及相关标志在欧洲和/或世界其他国家的芬兰和其他国家/地区是 The Qt Company Ltd 的商标。所有其他商标均为其各自所有者的财产。