QAxFactory 类

QAxFactory 类定义了一个 COM 组件的工厂。 更多...

头文件 #include <QAxFactory>
CMakefind_package(Qt6 REQUIRED COMPONENTS AxServer)
target_link_libraries(mytarget PRIVATE Qt6::AxServer)
qmakeQT += axserver
继承 QObject

公共类型

枚举ServerType { 单例, 多实例 }

公共函数

QAxFactory(const QUuid &libid, const QUuid &appid)
虚拟~QAxFactory() 覆盖重载
虚拟 QUuidappID() const
虚拟 QUuidclassID(const QString &key) const
虚拟 QObject *createObject(const QString &key) = 0
虚拟 boolcreateObjectWrapper(QObject *object, IDispatch **wrapper)
虚拟 QUuideventsID(const QString &key) const
虚拟 QStringexposeToSuperClass(const QString &key) const
虚拟 QStringListfeatureList() const = 0
虚拟 boolhasStockEvents(const QString &key) const
虚拟 QUuidinterfaceID(const QString &key) const
虚拟 boolisService() const
虚拟 const QMetaObject *metaObject(const QString &key) const = 0
虚拟 voidregisterClass(const QString &key, QSettings *settings) const
虚拟 boolstayTopLevel(const QString &key) const
虚拟 QUuidtypeLibID() const
虚拟 voidunregisterClass(const QString &key, QSettings *settings) const
虚拟 boolvalidateLicenseKey(const QString &key, const QString &licenseKey) const

静态公共成员

boolisServer()
boolregisterActiveObject(QObject *object)
QStringserverDirPath()
QStringserverFilePath()
boolstartServer(QAxFactory::ServerType type = MultipleInstances)
boolstopServer()

宏定义

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()。

另请参阅QAxAggregatedQAxBindableActiveQt 框架

成员类型文档

枚举 QAxFactory::ServerType直接链接到此处

此枚举指定可以使用startServer启动的不同类型的服务器。

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

成员函数文档

QAxFactory::QAxFactory(const QUuid &libid, const QUuid &appid)直接链接到此处

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

[重写虚函数 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 的商标。所有其他商标均为其各自所有者的财产。