本页内容

QAxFactory Class

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

头文件: #include <qaxfactory.h>
CMake: 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 控件设置额外的标志。若要限制小部件类从其父类公开的方法或属性数量,请重写exposeToSuperClass() 函数。

另请参阅 QAxAggregated 、QAxBindable 以及ActiveQt 框架。

成员类型文档

enum QAxFactory::ServerType

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

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

成员函数文档

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

构建一个 QAxFactory 对象,该对象在实现相应的接口函数时,会返回 `libid ` 和 `appid `。

[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

  • Click
  • DblClick
  • KeyDown
  • KeyDown
  • KeyUp
  • 鼠标按下
  • MouseUp
  • MouseMove

默认实现将 `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()

如果应用程序已被(通过 COM)作为 ActiveX 服务器启动,则返回 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 ,请在您自己的main()入口点函数中调用

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

。

[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

请重写此函数,使其在以下情况下返回 true:licenseKey 是类key 的有效许可证,或者当前机器已获得许可。

默认实现会在以下情况返回 true:类key 未获得许可(即没有Q_CLASSINFO() 属性“LicenseKey”),或licenseKey 与“LicenseKey”属性的值匹配,或者该计算机通过一个与该 COM 服务器同名的 .LIC 文件获得了许可。

宏文档

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 中。

Class 类型的实例只能通过已实例化对象的API来获取。

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

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