The OpenGL example demonstrates the use of the default factory and QAxFactory::isServer (), and the implementation of an additional COM interface using QAxBindable and QAxAggregated . The server executable can run both as an ActiveX server and as a stand-alone application.
此範例中的 ActiveX 控件使用 Qt QGlWidget 類在 ActiveX 中渲染 OpenGL 場景。控件暴露一些場景更改方法。
應用程序使用
QAxFactory
透過
QAXFACTORY_BEGIN()
,
QAXCLASS()
and
QAXFACTORY_END()
宏來暴露
GLBox
小部件作為 ActiveX 控製。
#include <QAxFactory> QAXFACTORY_BEGIN( "{2c3c183a-eeda-41a4-896e-3d9c12c3577d}", // type library ID "{83e16271-6480-45d5-aaf1-3f40b7661ae4}") // application ID QAXCLASS(GLBox) QAXFACTORY_END()
實現為
main
初始化
QApplication
對象,和使用
QAxFactory::isServer()
以確定創建和展示應用程序界麵是否閤適。
/* The main program is here. */ int main(int argc, char *argv[]) { QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication a(argc,argv); if (QOpenGLContext::openGLModuleType() != QOpenGLContext::LibGL) { qWarning("This system does not support OpenGL. Exiting."); return -1; } if (!QAxFactory::isServer()) { GLObjectWindow w; w.resize(400, 350); w.show(); return a.exec(); } return a.exec(); }
The
GLBox
類繼承自兩者
QOpenGLWidget
類為能夠渲染 OpenGL,和
QAxBindable
.
#include <QAxBindable> class GLBox : public QOpenGLWidget, public QOpenGLFunctions_1_1, public QAxBindable { Q_OBJECT Q_CLASSINFO("ClassID", "{5fd9c22e-ed45-43fa-ba13-1530bb6b03e0}") Q_CLASSINFO("InterfaceID", "{33b051af-bb25-47cf-a390-5cfd2987d26a}") Q_CLASSINFO("EventsID", "{8c996c29-eafa-46ac-a6f9-901951e765b5}")
類重實現 QAxBindable::createAggregate () 函數從 QAxBindable 以返迴指針指嚮 QAxAggregated 對象。
public: explicit GLBox(QWidget *parent, const char *name = nullptr); virtual ~GLBox(); QAxAggregated *createAggregate() override; public slots: void setXRotation(int degrees);
實現文件為
GLBox
類包括
objsafe.h
係統頭,在那裏
IObjectSafety
COM 接口有定義。
#include <objsafe.h>
類
ObjectSafetyImpl
的聲明是使用多繼承以子類化
QAxAggregated
類,並實現 IObjectSafety 接口。
class ObjectSafetyImpl : public QAxAggregated, public IObjectSafety { public:
類聲明默認構造函數,並實現 queryInterface 函數以支持 IObjectSafety 接口。
explicit ObjectSafetyImpl() = default;
long queryInterface(const QUuid &iid, void **iface) override
{
*iface = nullptr;
if (iid != IID_IObjectSafety)
return E_NOINTERFACE;
*iface = static_cast<IObjectSafety*>(this);
AddRef();
return S_OK;
}
由於各 COM 接口繼承
IUnknown
the
QAXAGG_IUNKNOWN
宏用於提供默認實現為
IUnknown
接口。宏定義將所有調用委托給
QueryInterface
,
AddRef
and
Release
到由 controllingUnknown() 函數返迴的接口。
QAXAGG_IUNKNOWN;
實現為
IObjectSafety
接口為調用者提供支持和啓用安全選項的有關信息,並返迴
S_OK
為所有調用以指示 ActiveX 控件是安全的。
HRESULT WINAPI GetInterfaceSafetyOptions(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions) override
{
Q_UNUSED(riid);
*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) override
{
Q_UNUSED(riid);
Q_UNUSED(pdwSupportedOptions);
Q_UNUSED(pdwEnabledOptions);
return S_OK;
}
};
實現為
createAggregate()
函數僅僅返迴新
ObjectSafetyImpl
對象。
QAxAggregated *GLBox::createAggregate() { return new ObjectSafetyImpl(); }
要構建範例必須先構建
QAxServer
庫。然後運行
qmake
和 make 工具在
examples/activeqt/wrapper
.
The demonstration 要求 WebBrowser 支持 ActiveX 控件,並啓用腳本。
相比其它 QAxServer 範例,Internet Explorer 不會打開對話框詢問用戶是否應該允許運行 GLBox 控件腳本 (瀏覽器的準確行為從屬 "Internet 選項" 對話框中的安全設置)。
<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>