Пример "OpenGL" (ActiveQt)
Файлы:
Пример "OpenGL" демонстрирует использование фабрики по умолчанию и QAxFactory::isServer(), а также реализацию дополнительного интерфейса COM используя QAxBindable и QAxAggregated. Исполняемый файл сервера можно запустить и как ActiveX-сервер и как автономное приложение.
Элемент управления ActiveX в этом примере использует класс QGlWidget в Qt для визуализации сцены OpenGL в ActiveX. Элемент управления делает видимым несколько методов изменения сцены.
Приложение использует фабрику по умолчанию как предоставляет макрос QAXFACTORY_DEFAULT чтобы сделать видимым виджет GLBox как элемент управления ActiveX.
#include <QAxFactory>
QAXFACTORY_DEFAULT( GLBox,
"{5fd9c22e-ed45-43fa-ba13-1530bb6b03e0}",
"{33b051af-bb25-47cf-a390-5cfd2987d26a}",
"{8c996c29-eafa-46ac-a6f9-901951e765b5}",
"{2c3c183a-eeda-41a4-896e-3d9c12c3577d}",
"{83e16271-6480-45d5-aaf1-3f40b7661ae4}"
)
Реализация main инициализирует объект QApplication и использует QAxFactory::isServer() для определения подойдет ли она или нет для создания и показа интерфейса приложения.
int main( int argc, char **argv )
{
QApplication::setColorSpec( QApplication::CustomColor );
QApplication a(argc,argv);
if ( !QGLFormat::hasOpenGL() ) {
qWarning( "This system has no OpenGL support. Exiting." );
return -1;
}
if ( !QAxFactory::isServer() ) {
GLObjectWindow w;
w.resize( 400, 350 );
w.show();
return a.exec();
}
return a.exec();
}
Класс GLBox унаследован и от класса QGLWidget чтобы иметь возможность визуализировать OpenGL, b jn QAxBindable.
#include <QAxBindable>
class GLBox : public QGLWidget,
public QAxBindable
{
Q_OBJECT
Класс переопределяет функцию QAxBindable::createAggregate() из QAxBindable для возврата указателя на объект QAxAggregated.
public:
GLBox( QWidget* parent, const char* name = 0 );
~GLBox();
QAxAggregated *createAggregate();
public slots:
void setXRotation( int degrees );
Остальная часть объявление класса и реализации визуализации OpenGL является такой же что и в оригинальном примере "box".
Файл реализации класса GLBox включает в себя системный заголовочный файл objsafe.h, в котором определён интерфейс COM IObjectSafety.
#include <objsafe.h>
Класс ObjectSafetyImpl объявлен с использованием множественного наследования для подкласса класса QAxAggregated и для реализации интерфейса IObjectSafety.
class ObjectSafetyImpl : public QAxAggregated,
public IObjectSafety
{
public:
Класс объявляет конструктор по умолчанию и реализует функцию queryInterface для поддержки интерфейса IObjectSafety.
ObjectSafetyImpl() {}
long queryInterface( const QUuid &iid, void **iface )
{
*iface = 0;
if ( iid == IID_IObjectSafety )
*iface = (IObjectSafety*)this;
else
return E_NOINTERFACE;
AddRef();
return S_OK;
}
Поскольку каждый интерфейс COM унаследован от IUnknown макрос QAXAGG_IUNKNOWN используется для предоставления реализацию по умолчанию интерфейса IUnknown. Макрос определён для делегирования всех вызовов QueryInterface, AddRef и Release для интерфейса, возвращаемого функцией controllingUnknown().
QAXAGG_IUNKNOWN;
Реализация интерфейса IObjectSafety предоставляет вызывающему информацию о поддерживаемых и включенных опциях безопасности, а возвращает S_OK для всех вызовов чтобы показать, что элемент управления ActiveX является безопасным.
HRESULT WINAPI GetInterfaceSafetyOptions( REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions )
{
*pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
return S_OK;
}
HRESULT WINAPI SetInterfaceSafetyOptions( REFIID riid, DWORD pdwSupportedOptions, DWORD pdwEnabledOptions )
{
return S_OK;
}
};
Реализация функции createAggregate() возвращает только новый объект ObjectSafetyImpl.
QAxAggregated *GLBox::createAggregate()
{
return new ObjectSafetyImpl();
}
Чтобы собрать пример вы должны сначала собрать библиотеку QAxServer. Затем запустите qmake и ваш make-инструмент в каталоге examples/activeqt/wrapper.
Демонстрационная программа требует поддержки элементов управления ActiveX в вашем веб-браузере, а также разрешения выполнения сценариев.
В отличие от других примеров QAxServer Internet Explorer не откроет диалоговое окно для запроса у пользователя будет или нет разрешено выполнение сценариев элемента управления GLBox (точное поведение браузера зависит от настроек безопасности в диалоге Internet Options).
<SCRIPT LANGUAGE="JavaScript">
function setRot( form )
{
GLBox.setXRotation( form.XEdit.value );
GLBox.setYRotation( form.YEdit.value );
GLBox.setZRotation( form.ZEdit.value );
}
</SCRIPT>
<p />
An OpenGL scene:<br />
<object ID="GLBox" CLASSID="CLSID:5fd9c22e-ed45-43fa-ba13-1530bb6b03e0"
CODEBASE="http://qt.nokia.com/demos/openglax.cab">
[Object not available! Did you forget to build and register the server?]
</object><br />
<form>
Rotate the scene:<br />
X:<input type="edit" ID="XEdit" value="0" /><br />
Y:<input type="edit" name="YEdit" value="0" /><br />
Z:<input type="edit" name="ZEdit" value="0" /><br />
<input type="button" value="Set" onClick="setRot(this.form)" />
</form>
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|