1
/****************************************************************************
3
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4
** Contact: Nokia Corporation (qt-info@nokia.com)
6
** This file is part of the documentation of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
10
** Licensees holding valid Qt Commercial licenses may use this file in
11
** accordance with the Qt Commercial License Agreement provided with the
12
** Software or, alternatively, in accordance with the terms contained in
13
** a written agreement between you and Nokia.
15
** GNU Lesser General Public License Usage
16
** Alternatively, this file may be used under the terms of the GNU Lesser
17
** General Public License version 2.1 as published by the Free Software
18
** Foundation and appearing in the file LICENSE.LGPL included in the
19
** packaging of this file. Please review the following information to
20
** ensure the GNU Lesser General Public License version 2.1 requirements
21
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23
** In addition, as a special exception, Nokia gives you certain
24
** additional rights. These rights are described in the Nokia Qt LGPL
25
** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
28
** GNU General Public License Usage
29
** Alternatively, this file may be used under the terms of the GNU
30
** General Public License version 3.0 as published by the Free Software
31
** Foundation and appearing in the file LICENSE.GPL included in the
32
** packaging of this file. Please review the following information to
33
** ensure the GNU General Public License version 3.0 requirements will be
34
** met: http://www.gnu.org/copyleft/gpl.html.
36
** If you are unsure which license is appropriate for your use, please
37
** contact the sales department at http://www.qtsoftware.com/contact.
40
****************************************************************************/
44
\title QAxContainer Module
45
\contentspage Qt's Modules
50
\brief The QAxContainer module is a Windows-only extension for
51
accessing ActiveX controls and COM objects.
53
The QAxContainer module is part of the \l ActiveQt framework. It
54
provides a library implementing a QWidget subclass, QAxWidget,
55
that acts as a container for ActiveX controls, and a QObject
56
subclass, QAxObject, that can be used to easily access non-visual
57
COM objects. Scripting COM objects embedded using these classes
58
is possible through the QAxScript, QAxScriptManager and
59
QAxScriptEngine classes, and a set of \l{Tools for ActiveQt}{tools}
60
makes it easy to access COM objects programmatically.
62
The module consists of six classes
64
\o QAxBase is an abstract class that provides an API to initialize
65
and access a COM object or ActiveX control.
66
\o QAxObject provides a QObject that wraps a COM object.
67
\o QAxWidget is a QWidget that wraps an ActiveX control.
68
\o QAxScriptManager, QAxScript and QAxScriptEngine provide an
69
interface to the Windows Script Host.
72
Some \l{Qt Examples#ActiveQt}{example applications} that use
73
standard ActiveX controls to provide high-level user interface
74
functionality are provided.
76
\sa {ActiveQt Framework}
82
\section1 Using the Library
84
To build Qt applications that can host COM objects and ActiveX controls
85
link the application against the QAxContainer module by adding
87
\snippet doc/src/snippets/code/doc_src_qaxcontainer.qdoc 0
89
to your application's \c .pro file.
91
\section2 Distributing QAxContainer Applications
93
The QAxContainer library is static, so there is no need to redistribute
94
any additional files when using this module. Note however that the
95
ActiveX server binaries you are using might not be installed on the
96
target system, so you have to ship them with your package and register
97
them during the installation process of your application.
99
\section1 Instantiating COM Objects
101
To instantiate a COM object use the QAxBase::setControl() API, or pass
102
the name of the object directly into the constructor of the QAxBase
103
subclass you are using.
105
The control can be specified in a variety of formats, but the fastest
106
and most powerful format is to use the class ID (CLSID) of the object
107
directly. The class ID can be prepended with information about a remote
108
machine that the object should run on, and can include a license key
109
for licensed controls.
111
\section2 Typical Error Messages
113
ActiveQt prints error messages to the debug output when it
114
encounters error situations at runtime. Usually you must run
115
your program in the debugger to see these messages (e.g. in Visual
116
Studio's Debug output).
118
\section3 Requested control could not be instantiated
120
The control requested in QAxBase::setControl() is not installed
121
on this system, or is not accessible for the current user.
123
The control might require administrator rights, or a license key.
124
If the control is licensed, pass the license key to QAxBase::setControl
127
\section1 Accessing the Object API
129
ActiveQt provides a Qt API to the COM object, and replaces COM
130
datatypes with Qt equivalents.
132
There are four ways to call APIs on the COM object:
135
\o Generating a C++ namespace
137
\o Through a script engine
138
\o Using the native COM interfaces
141
\section2 Generating a C++ Namespace
143
To generate a C++ namespace for the type library you want to access,
144
use the \l dumpcpp tool. Run this tool manually on the type library you
145
want to use, or integrate it into the build system by adding the type
146
libraries to the \c TYPELIBS variable in your application's \c .pro file:
148
\snippet doc/src/snippets/code/doc_src_qaxcontainer.qdoc 1
150
Note that \l dumpcpp might not be able to expose all APIs in the type
153
Include the resulting header file in your code to access the
154
object APIs through the generated C++ classes. See the
155
\l{activeqt/qutlook}{Qutlook} example for more information.
157
\section2 Call-by-Name
159
Use QAxBase::dynamicCall() and QAxBase::querySubObject() as well as
160
the QObject::setProperty() and QObject::property() APIs to call the
161
methods and properties of the COM object through their name. Use the
162
\l dumpdoc tool to get the documentation of the Qt API for any COM
163
object and its subobjects; note that not all of the COM object's APIs
166
See the \l{activeqt/webbrowser}{Webbrowser} example for more information.
168
\section2 Calling Function Through a Script Engine
170
A Qt application can host any ActiveScript engine installed on the system.
171
The script engine can then run script code that accesses the COM objects.
173
To instantiate a script engine, use QAxScriptManager::addObject() to
174
register the COM objects you want to access from script, and
175
QAxScriptManager::load() to load the script code into the engine. Then
176
call the script functions using QAxScriptManager::call() or
179
Which APIs of the COM object are available through scripting depends on
180
the script language used.
182
The \l{testcon - An ActiveX Test Container (ActiveQt)}{ActiveX Test Container}
183
demonstrates loading of script files.
185
\section2 Calling a Function Using the Native COM Interfaces
187
To call functions of the COM object that can not be accessed via any
188
of the above methods it is possible to request the COM interface directly
189
using QAxBase::queryInterface(). To get a C++ definition of the respective
190
interface classes use the \c #import directive with the type library
191
provided with the control; see your compiler manual for details.
193
\section2 Typical Error Messages
195
ActiveQt prints error messages to the debug output when it
196
encounters error situations at runtime. Usually you must run
197
your program in the debugger to see these messages (e.g. in Visual
198
Studio's Debug output).
200
\section3 QAxBase::internalInvoke: No such method
202
A QAxBase::dynamicCall() failed - the function prototype did not
203
match any function available in the object's API.
205
\section3 Error calling IDispatch member: Non-optional parameter missing
207
A QAxBase::dynamicCall() failed - the function prototype was correct,
208
but too few parameters were provided.
210
\section3 Error calling IDispatch member: Type mismatch in parameter n
212
A QAxBase::dynamicCall() failed - the function prototype was correct,
213
but the paramter at index \c n was of the wrong type and could
214
not be coerced to the correct type.
216
\section3 QAxScriptManager::call(): No script provides this function
218
You try to call a function that is provided through an engine
219
that doesn't provide introspection (ie. ActivePython or
220
ActivePerl). You need to call the function directly on the
221
respective QAxScript object.
223
\section1 License Information
225
The QAxContainer module is not covered by the \l{GNU General Public License (GPL)},
226
the \l{GNU Lesser General Public License (LGPL)}, or the
227
\l{Qt Commercial Editions}{Qt Commercial License}. Instead, it is distributed under
228
the following license.
231
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\br
234
Contact: Nokia Corporation (qt-info@nokia.com)\br
236
You may use this file under the terms of the BSD license as follows:\br
238
"Redistribution and use in source and binary forms, with or without modification,
239
are permitted provided that the following conditions are met:
241
* Redistributions of source code must retain the above copyright notice, this list
242
of conditions and the following disclaimer.\br
243
* Redistributions in binary form must reproduce the above copyright notice, this
244
list of conditions and the following disclaimer in the documentation and/or other
245
materials provided with the distribution.\br
246
* Neither the name of Nokia Corporation and its Subsidiary(-ies) nor the names of
247
its contributors may be used to endorse or promote products derived from this
248
software without specific prior written permission.
250
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
251
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
252
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
253
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
254
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
255
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
256
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
257
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
258
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."