The QAxBase class is an abstract class that provides an API to initialize and access a COM object. 更多...
头: | #include <QAxBase> |
CMake: |
find_package(Qt6 COMPONENTS AxContainer REQUIRED)
target_link_libraries(mytarget PRIVATE Qt6::AxContainer) |
qmake: | QT += axcontainer |
继承者: | QAxObject and QAxWidget |
PropertyBag |
virtual | ~QAxBase () |
QVariant | asVariant () const |
ulong | classContext () const |
void | clear () |
QString | control () const |
void | disableClassInfo () |
void | disableEventSink () |
void | disableMetaObject () |
QVariant | dynamicCall (const char * function , const QVariant & var1 = QVariant(), const QVariant & var2 = QVariant(), const QVariant & var3 = QVariant(), const QVariant & var4 = QVariant(), const QVariant & var5 = QVariant(), const QVariant & var6 = QVariant(), const QVariant & var7 = QVariant(), const QVariant & var8 = QVariant()) |
QVariant | dynamicCall (const char * function , QList<QVariant> & vars ) |
QString | generateDocumentation () |
bool | isNull () const |
QAxBase::PropertyBag | propertyBag () const |
virtual bool | propertyWritable (const char * prop ) const |
long | queryInterface (const QUuid & uuid , void ** iface ) const |
QAxObject * | querySubObject (const char * name , const QVariant & var1 = QVariant(), const QVariant & var2 = QVariant(), const QVariant & var3 = QVariant(), const QVariant & var4 = QVariant(), const QVariant & var5 = QVariant(), const QVariant & var6 = QVariant(), const QVariant & var7 = QVariant(), const QVariant & var8 = QVariant()) |
QAxObject * | querySubObject (const char * name , QList<QVariant> & vars ) |
void | setClassContext (ulong classContext ) |
void | setPropertyBag (const QAxBase::PropertyBag & bag ) |
virtual void | setPropertyWritable (const char * prop , bool ok ) |
QStringList | verbs () const |
QAxBase () | |
virtual bool | initialize (IUnknown ** ptr ) |
bool | initializeActive (IUnknown ** ptr ) |
bool | initializeFromFile (IUnknown ** ptr ) |
bool | initializeLicensed (IUnknown ** ptr ) |
bool | initializeRemote (IUnknown ** ptr ) |
QAxBase is an abstract class that cannot be used directly, and is instantiated through the subclasses QAxObject and QAxWidget 。此类提供能直接访问 COM 对象的 API,透过其 IUnknown 实现。若 COM 对象有实现 IDispatch 接口,该对象的特性和方法将变为可用 Qt 特性和槽。
connect(buttonBack, SIGNAL(clicked()), webBrowser, SLOT(GoBack()));
由对象 IDispatch 实现暴露的特性,可以透过 Qt 对象模型提供的特性系统进行读写 (两者的子类是 QObject ,所以可以使用 QObject::setProperty () 和 QObject::property ())。不支持具有多个参数的特性。
activeX->setProperty("text", "some text"); int value = activeX->property("value");
可以直接调用由对象的 IDispatch 实现暴露的属性及其它方法的写入函数,使用 dynamicCall (),或间接作为连接到信号的槽。
webBrowser->dynamicCall("GoHome()");
由 COM 对象支持的传出事件,将作为标准 Qt 信号被发射。
connect(webBrowser, SIGNAL(TitleChanged(QString)), this, SLOT(setCaption(QString)));
QAxBase transparently converts between COM data types and the equivalent Qt data types. Some COM types have no equivalent Qt data structure.
下表第 1 列列出支持的 COM 数据类型。第 2 列是 Qt 类型可以用于 QObject 特性函数。第 3 列是 Qt 类型用于生成信号原型和内参数槽,最后列是 Qt 类型用于信号原型和外参数槽。
COM 类型 | Qt 特性 | 内参数 | 外参数 |
---|---|---|---|
VARIANT_BOOL | bool | bool | bool& |
BSTR | QString | const QString & | QString & |
char, short, int, long | int | int | int& |
uchar, ushort, uint, ulong | uint | uint | uint& |
float, double | double | double | double& |
DATE | QDateTime | const QDateTime & | QDateTime & |
CY | qlonglong | qlonglong | qlonglong& |
OLE_COLOR | QColor | const QColor & | QColor & |
SAFEARRAY(VARIANT) | QList < QVariant > | const QList < QVariant >& | QList < QVariant >& |
SAFEARRAY(int), SAFEARRAY(double), SAFEARRAY(Date) | QList < QVariant > | const QList < QVariant >& | QList < QVariant >& |
SAFEARRAY(BYTE) | QByteArray | const QByteArray & | QByteArray & |
SAFEARRAY(BSTR) | QStringList | const QStringList & | QStringList & |
VARIANT | 从属类型 | const QVariant & | QVariant & |
IFontDisp* | QFont | const QFont & | QFont & |
IPictureDisp* | QPixmap | const QPixmap & | QPixmap & |
IDispatch* | QAxObject * |
QAxBase::asVariant()
|
QAxObject * (return value) |
IUnknown* | QAxObject * |
QAxBase::asVariant()
|
QAxObject * (return value) |
SCODE, DECIMAL | 不支持 | 不支持 | 不支持 |
VARIANT* (从 Qt 4.5 起) | 不支持 | QVariant& | QVariant& |
还支持枚举和支持类型的 typedef。
调用以下 IDL 描述的 COM 接口方法
dispinterface IControl { properties: [id(1)] BSTR text; [id(2)] IFontDisp *font; methods: [id(6)] void showColumn([in] int i); [id(3)] bool addColumn([in] BSTR t); [id(4)] int fillList([in, out] SAFEARRAY(VARIANT) *list); [id(5)] IDispatch *item([in] int i); };
use the QAxBase API like this:
QAxObject object("<CLSID>"); QString text = object.property("text").toString(); object.setProperty("font", QFont("Times New Roman", 12)); connect(this, SIGNAL(clicked(int)), &object, SLOT(showColumn(int))); bool ok = object.dynamicCall("addColumn(const QString&)", "Column 1").toBool(); QList<QVariant> varlist; QList<QVariant> parameters; parameters << QVariant(varlist); int n = object.dynamicCall("fillList(QList<QVariant>&)", parameters).toInt(); QAxObject *item = object.querySubItem("item(int)", 5);
注意, QList 对象的填充必须提供成元素在参数列表 QVariant 。
若需要访问不支持数据类型的特性 (或传递参数),必须直接访问 COM 对象透过其
IDispatch
实现或其它接口。可以检索这些接口透过
queryInterface
().
IUnknown *iface = 0; activeX->queryInterface(IID_IUnknown, (void**)&iface); if (iface) { // use the interface iface->Release(); }
要获取 COM 接口的定义,必须使用随要使用组件提供的头文件。某些编译器还可以使用 #import 编译器指令导入类型库。见组件文档编制,找出必须导入哪些类型库及如何使用它们。
若需要对传递不支持数据类型的参数的事件做出反应,可以使用如由 COM 事件提供的交付事件数据的一般信号。
另请参阅 QAxObject , QAxWidget , QAxScript ,和 ActiveQt 框架 .
[alias]
QAxBase::
PropertyBag
A QMap < QString , QVariant > 可以按 name:value 对形式存储特性。
[protected]
QAxBase::
QAxBase
()
Creates a QAxBase object.
[虚拟]
QAxBase::
~QAxBase
()
关闭 COM 对象并销毁 QAxBase 对象。
另请参阅 clear ().
返回 QVariant 包裹 COM (组件对象模型) 对象。然后,变体可以用作参数,如在 dynamicCall ().
[since 5.13]
ulong
QAxBase::
classContext
() const
Returns the context the ActiveX control will run in (default CLSCTX_SERVER).
该函数在 Qt 5.13 引入。
另请参阅 setClassContext ().
断开连接并销毁 COM 对象。
若重实现此函数,还必须重实现析构函数以调用 clear(),并在 clear() 函数末尾调用此实现。
Returns the ActiveX control.
禁用此 ActiveX 容器的类信息生成。若不要求有关 ActiveX 控件的任何类信息,使用此函数以加速元对象的生成。
注意,必须在构造对象后立即调用此函数
禁用此 ActiveX 容器的事件汇点实现。若不打算监听 ActiveX 控件事件,使用此函数能加速元对象的生成。
某些 ActiveX 控件可能不稳定,当连接到事件汇点时。要获取 OLE (对象链接和嵌入) 事件,必须使用标准 COM 方法注册自己的事件汇点。使用 queryInterface () 能访问原生 COM 对象。
注意,应立即调用此函数在对象构造后。
Disables the meta object generation for this ActiveX container. This also disables the event sink and class info generation. If you don't intend to use the Qt meta object implementation call this function to speed up instantiation of the control. You will still be able to call the object through dynamicCall (), but signals, slots and properties will not be available with QObject API。
Some ActiveX controls might be unstable when used with OLE automation. Use standard COM methods to use those controls through the COM interfaces provided by queryInterface ().
Note that this function must be called immediately after construction of the object.
调用 COM 对象的方法 function ,传递参数 var1 , var1 , var2 , var3 , var4 , var5 , var6 , var7 and var8 ,并返回由方法返回的值,或无效 QVariant 若方法不返回值,或当函数调用失败时。
若 function 是必须以完整原型提供的字符串对象方法,例如,如将编写它在 QObject::connect () 调用。
activeX->dynamicCall("Navigate(const QString&)", "www.qt-project.org");
另外,可以调用嵌入字符串中的参数传递函数,如,也可以援引上述函数使用
activeX->dynamicCall("Navigate(\"www.qt-project.org\")");
所有参数以字符串形式传递;从属控件是否正确解释它们,但比使用带有正确类型参数的原型要慢。
若 function 是字符串必须是特性名的特性。调用 setter 特性当 var1 有效 QVariant ,否则调用 Getter。
activeX->dynamicCall("Value", 5); QString text = activeX->dynamicCall("Text").toString();
请注意,它更快比获取和设置特性使用 QObject::property () 和 QObject::setProperty ().
dynamicCall() 还可以用于调用对象采用 禁用元对象 wrapper, which can improve performance significantely, esp. when calling many different objects of different types during an automation process. ActiveQt will then however not validate parameters.
只能透过 dynamicCall() 调用拥有参数或数据类型返回值的函数,数据类型的支持是通过 QVariant 。见 QAxBase 类文档编制了解支持和不支持的数据类型列表。若想要调用参数列表中拥有不支持数据类型的函数,使用 queryInterface () 检索适当 COM 接口,并直接使用函数。
IWebBrowser2 *webBrowser = 0; activeX->queryInterface(IID_IWebBrowser2, (void **)&webBrowser); if (webBrowser) { webBrowser->Navigate2(pvarURL); webBrowser->Release(); }
此外,这更高效。
这是重载函数。
调用 COM 对象的方法 function ,传递参数在 vars ,并返回由方法返回的值。若方法不返回值 (或当函数调用失败时),此函数返回无效 QVariant 对象。
QVariant 对象在 vars 会更新当方法拥有输出参数时。
QString QAxBase:: generateDocumentation ()返回带有包裹 COM 对象文档编制的富文本字符串。将字符串转储到 HTML 文件,或使它如在 QTextBrowser 小部件。
[virtual protected]
bool
QAxBase::
initialize
(
IUnknown
**
ptr
)
This virtual function is called by setControl() and creates the requested COM object. ptr is set to the object's IUnknown implementation. The function returns true if the object initialization succeeded; otherwise the function returns false.
The default implementation interprets the string returned by control (), and calls initializeRemote (), initializeLicensed () 或 initializeActive () if the string matches the respective patterns. If control () is the name of an existing file, initializeFromFile () is called. If no pattern is matched, or if remote or licensed initialization fails, CoCreateInstance is used directly to create the object.
见 QAxBaseWidget::control 特性文档编制,了解支持模式的有关细节。
The interface returned in ptr must be referenced exactly once when this function returns. The interface provided by e.g. CoCreateInstance is already referenced, and there is no need to reference it again.
[protected]
bool
QAxBase::
initializeActive
(
IUnknown
**
ptr
)
Connects to an active instance running on the current machine, and returns the IUnknown interface to the running object in ptr . This function returns true if successful, otherwise returns false.
此函数被调用通过 initialize () if the control string contains the substring "}&".
另请参阅 initialize ().
[protected]
bool
QAxBase::
initializeFromFile
(
IUnknown
**
ptr
)
Creates the COM object handling the filename in the control property, and returns the IUnknown interface to the object in ptr . This function returns true if successful, otherwise returns false.
此函数被调用通过 initialize () 若控制字符串是现有文件名。
另请参阅 initialize ().
[protected]
bool
QAxBase::
initializeLicensed
(
IUnknown
**
ptr
)
Creates an instance of a licensed control, and returns the IUnknown interface to the object in ptr . This functions returns true if successful, otherwise returns false.
此函数被调用通过 initialize () if the control string contains the substring "}:". The license key needs to follow this substring.
另请参阅 initialize ().
[protected]
bool
QAxBase::
initializeRemote
(
IUnknown
**
ptr
)
Creates the instance on a remote server, and returns the IUnknown interface to the object in ptr . This function returns true if successful, otherwise returns false.
此函数被调用通过 initialize () if the control string contains the substring "/{". The information about the remote machine needs to be provided in front of the substring.
另请参阅 initialize ().
返回 true 若此包裹器没有加载 COM 对象;否则返回 false。
另请参阅 control ().
返回由 COM 对象暴露的所有特性的 name:value 映射。
This is more efficient than getting multiple properties individually if the COM object supports property bags.
警告: It is not guaranteed that the property bag implementation of the COM object returns all properties, or that the properties returned are the same as those available through the IDispatch interface.
另请参阅 setPropertyBag ().
[虚拟]
bool
QAxBase::
propertyWritable
(const
char
*
prop
) const
返回 true 若特性 prop 可写;否则返回 false。默认情况下,所有特性可写。
警告: 从属控件实现,某些特性可能忽略此设置。
另请参阅 setPropertyWritable (), QAxBaseWidget::propertyChanged (),和 QAxBaseObject::propertyChanged ().
请求接口 uuid 从 COM 对象并设置值 iface 为提供接口,或为 0 若无法提供请求接口。
返回 COM 对象 QueryInterface 实现的结果。
另请参阅 control ().
返回指针指向 QAxObject 包裹 COM 对象提供通过方法或特性 name ,传递参数 var1 , var1 , var2 , var3 , var4 , var5 , var6 , var7 and var8 .
若 name 由方法提供,字符串必须包含完整函数原型。
若 name 是特性,字符串必须是特性名,且 var1 , ... var8 被忽略。
返回的 QAxObject 是此对象的子级 (类型 QAxObject or QAxWidget ),并被删除当删除此对象时。不管怎样,自己删除返回对象是安全的,且应该这样做当遍历子对象列表时。
启用 COM (组件对象模型) 的应用程序通常拥有对象模型,将应用程序的某些元素发布成分派接口。使用此方法能导航对象模型的层次结构,如
QAxWidget outlook("Outlook.Application"); QAxObject *session = outlook.querySubObject("Session"); if (session) { QAxObject *defFolder = session->querySubObject( "GetDefaultFolder(OlDefaultFolders)", "olFolderContacts"); //... }
这是重载函数。
QVariant 对象在 vars 会更新当方法拥有输出参数时。
[since 5.13]
void
QAxBase::
setClassContext
(
ulong
classContext
)
Sets the context the ActiveX control will run in to classContext
Affects the "dwClsContext" argument when calling CoCreateInstance. This can be used to control in-proc vs. out-of-proc startup for controls supporting both alternatives. Also, it can be used to modify/reduce control permissions when used with CLSCTX_ENABLE_CLOAKING and an impersonation token.
Note that this function must be called before setControl() to have any effect.
该函数在 Qt 5.13 引入。
另请参阅 classContext ().
将 COM (组件对象模型) 对象的特性设为相应值按 bag .
警告: 才应设置特性包若有返回通过 propertyBag 函数,因为无法保证 COM 对象特性包实现,支持可用于 IDispatch 接口的相同特性。
另请参阅 propertyBag ().
[虚拟]
void
QAxBase::
setPropertyWritable
(const
char
*
prop
,
bool
ok
)
设置特性 prop 可写若 ok 为 true,否则设置 prop 为只读。默认情况下,所有属性可写。
警告: 从属控件实现,某些特性可能忽略此设置。
另请参阅 propertyWritable (), QAxBaseWidget::propertyChanged (),和 QAxBaseObject::propertyChanged ().
返回 COM 对象的可执行 verbs 列表。若对象未实现 IOleObject,或不支持任何 verbs,那么此函数返回空字符串列表。
注意,OLE 默认 verbs (OLIVERB_SHOW 等) 未包括在列表中。