QAxFactory Class

QAxFactory 类定义了一个用于创建 COM 组件的工厂。更多

头文件: #include <QAxFactory>
CMake.QAxFactory find_package(Qt6 REQUIRED COMPONENTS AxServer)
target_link_libraries(mytarget PRIVATE Qt6::AxServer)
qmake: QT += axserver
继承: QObject

公共类型

enum ServerType { SingleInstance, MultipleInstances }

公共函数

QAxFactory(const QUuid &libid, const QUuid &appid)
virtual ~QAxFactory() override
virtual QUuid appID() const
virtual QUuid classID(const QString &key) const
virtual QObject *createObject(const QString &key) = 0
virtual bool createObjectWrapper(QObject *object, IDispatch **wrapper)
virtual QUuid eventsID(const QString &key) const
virtual QString exposeToSuperClass(const QString &key) const
virtual QStringList featureList() const = 0
virtual bool hasStockEvents(const QString &key) const
virtual QUuid interfaceID(const QString &key) const
virtual bool isService() const
virtual const QMetaObject *metaObject(const QString &key) const = 0
virtual void registerClass(const QString &key, QSettings *settings) const
virtual bool stayTopLevel(const QString &key) const
virtual QUuid typeLibID() const
virtual void unregisterClass(const QString &key, QSettings *settings) const
virtual 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 控件设置其他标志。要限制 widget 类从其父类公开的方法或属性的数量,请重新实现exposeToSuperClass().

另请参阅 QAxAggregated,QAxBindable, 和ActiveQt 框架

成员类型文档

enum QAxFactory::ServerType

该枚举指定了可通过startServer 启动的不同类型服务器。

常量说明
QAxFactory::SingleInstance0服务器进程只能为每个导出类创建一个实例。COM 会为每个请求启动一个新进程。这通常用于只导出一个可创建类的服务器。
QAxFactory::MultipleInstances1服务器可为每个导出类创建多个实例。这是默认情况。所有实例都将在同一线程中运行,并共享静态资源。

成员函数文档

QAxFactory::QAxFactory(const QUuid &libid, const QUuid &appid)

构造一个 QAxFactory 对象,在实现相应接口函数时返回libidappid

[override virtual noexcept] QAxFactory::~QAxFactory()

销毁QAxFactory 对象。

[virtual] QUuid QAxFactory::appID() const

重新实现此函数以返回 ActiveX 服务器的应用程序标识符。

[virtual] QUuid QAxFactory::classID(const QString &key) const

重新实现该函数可返回featureList() 实现返回的每个key 的类标识符,如果该工厂不支持key 的值,则返回空的QUuid

默认实现将key 解释为类名称,并返回Q_CLASSINFO() 条目 "ClassID "的值。

[pure virtual] QObject *QAxFactory::createObject(const QString &key)

重新实现此函数可返回key 的新对象,如果此工厂不支持key 的值,则返回 0。

如果返回的对象是QWidget ,它将作为 ActiveX 控件公开,否则返回的对象将作为简单的 COM 对象公开。

[virtual] bool QAxFactory::createObjectWrapper(QObject *object, IDispatch **wrapper)

wrapper 中重新实现此函数,为object 提供 COM 对象。如果函数执行成功,则返回 true;否则返回 false。

默认实现会根据object 的元对象信息创建一个通用自动化包装器。

[virtual] QUuid QAxFactory::eventsID(const QString &key) const

重新实现该函数可返回featureList() 实现返回的每个key 的事件接口标识符,如果该工厂不支持key 的值,则返回空的QUuid

默认实现将key 解释为类名称,并返回Q_CLASSINFO() 条目 "EventsID "的值。

[virtual] QString QAxFactory::exposeToSuperClass(const QString &key) const

重新实现该函数可返回key 的超类名称,ActiveX 控件应向其公开方法和属性。

默认实现将key 解释为类名称,并返回Q_CLASSINFO() 条目 "ToSuperClass "的值。如果没有设置该值,则返回空字符串,并公开包括QWidget 在内的所有超级类的函数和属性。

要只公开类本身的函数和属性,请重新实现此函数,返回key

[pure virtual] QStringList QAxFactory::featureList() const

重新实现该函数,以返回该工厂支持的部件(类名)列表。

[virtual] bool QAxFactory::hasStockEvents(const QString &key) const

如果 ActiveX 控件key 应支持标准 ActiveX 事件,则重新实现该函数以返回 true

  • 单击
  • 双击
  • 按键
  • 按键
  • 上键
  • 鼠标向下
  • 鼠标上移
  • 鼠标移动

默认实现将key 解释为类名称,如果Q_CLASSINFO() 项 "StockEvents "的值为 "yes",则返回 true。否则该函数返回 false。

[virtual] QUuid QAxFactory::interfaceID(const QString &key) const

重新实现该函数可返回featureList() 实现返回的每个key 的接口标识符,如果该工厂不支持key 的值,则返回空的QUuid

默认实现将key 解释为类名称,并返回Q_CLASSINFO() 条目 "InterfaceID "的值。

[static] 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();
}

[virtual] bool QAxFactory::isService() const

如果服务器作为持久服务(如 NT 服务)运行,即使提供的所有对象都已释放,也不应终止,则重新实现此函数返回 true。

默认实现返回 false。

[pure virtual] const QMetaObject *QAxFactory::metaObject(const QString &key) const

重新实现该函数后,将返回与key 对应的QMetaObject ,如果该工厂不支持key 的值,则返回 0。

[static] bool QAxFactory::registerActiveObject(QObject *object)

QObject object 注册为 COM 运行对象,如果注册成功则返回 true,否则返回 false。对象销毁时将自动取消注册。

只有当应用程序由用户启动时(即不是由 COM 响应请求时),才应调用此函数,而且只能调用一个对象,通常是应用程序对象层次结构中的顶层对象。

如果对象的 "RegisterObject "类信息未设置为 "yes",或者服务器是进程内服务器,则该函数不会执行任何操作,并返回 false。

[virtual] 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

[static] QString QAxFactory::serverDirPath()

返回包含服务器二进制文件的目录。

对于进程外服务器,该功能与QCoreApplication::applicationDirPath() 相同。对于进程内服务器,该函数将返回包含托管应用程序的目录。

[static] QString QAxFactory::serverFilePath()

返回服务器二进制文件的文件路径。

对于进程外服务器,该功能与QCoreApplication::applicationFilePath() 相同。对于进程内服务器,该函数返回托管应用程序的文件路径。

[static] bool QAxFactory::startServer(QAxFactory::ServerType type = MultipleInstances)

使用type 启动 COM 服务器,如果成功则返回 true,否则返回 false。

如果服务器已在运行(或服务器处于进程中),则调用此函数不会执行任何操作,而是返回 true。

如果服务器可执行文件已使用-activex 命令行参数启动,则服务器会自动启动,并将type 设置为MultipleInstances 。要切换到SingleInstance ,请在您自己的

if (QAxFactory::isServer()) {
    QAxFactory::stopServer();
    QAxFactory::startServer(QAxFactory::SingleInstance);
}

在自己的 main() 入口函数中调用。

[virtual] bool QAxFactory::stayTopLevel(const QString &key) const

如果 ActiveX 控件key 应为顶层窗口(如对话框),则重新实现此函数以返回 true。默认实现返回 false。

[static] bool QAxFactory::stopServer()

停止 COM 服务器,如果成功则返回 true,否则返回 false。

如果服务器未运行(或服务器处于进程中),则调用此函数不会执行任何操作,而是返回 true。

停止服务器不会使现有对象失效,但不能从现有服务器进程中创建新对象。通常情况下,如果请求创建其他对象,COM 会启动一个新的服务器进程。

当 main() 函数返回时,服务器会自动停止。

[virtual] QUuid QAxFactory::typeLibID() const

重新实现该函数以返回 ActiveX 服务器的类型库标识符。

[virtual] void QAxFactory::unregisterClass(const QString &key, QSettings *settings) const

使用settings 对象从系统注册表中取消注册key 类的任何附加值。

settings->remove("/CLSID/" + classID(key)
                 + "/Implemented Categories"
                 + "/{00000000-0000-0000-000000000000}/.");

另请参阅 registerClass() 和QSettings

[virtual] bool QAxFactory::validateLicenseKey(const QString &key, const QString &licenseKey) const

如果licenseKey 是类key 的有效许可证,或当前机器已获得许可证,则重新实现此函数返回 true。

如果类key 未获得许可(即无Q_CLASSINFO() 属性 "LicenseKey"),或licenseKey 与 "LicenseKey "属性值匹配,或机器通过与此 COM 服务器文件名相同的 .LIC 文件获得许可,则默认实现返回 true。

宏文档

QAXCLASS(Class)

该宏将一个可创建的 COM 类Class 添加到用QAXFACTORY_BEGIN() 宏声明的QAxFactory 中。

另请参阅 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 中使用。

只有使用已实例化对象的 API 才能检索Class 类型的实例。

另请参阅 QAXFACTORY_BEGIN()、QAXCLASS()、QAXFACTORY_END() 和Q_CLASSINFO()。

© 2025 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.