Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ setSpeed() ΠΈ setRadius() ΡΠ»Π΅Π΄ΡΡΡ ΡΡΠΎΠΌΡ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΡΡ, ΠΈ ΡΠ°ΠΊ ΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ»ΠΎΡΡ start() ΠΈ stop(), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° running (ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ).
ΠΡΡΠ°Π»ΠΎΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡβΡΠ»Π΅Π½ ΠΊΠ»Π°ΡΡΠ° AxBouncer:
QAxAggregated *AxBouncer::createAggregate()
{
return new ObjectSafetyImpl;
}
Π€ΡΠ½ΠΊΡΠΈΡ createAggregate() ΠΊΠ»Π°ΡΡΠ° QAxBindable ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ. ΠΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π‘ΠΠ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ QAxServer Π΅ΡΠ΅ Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π», ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠΉΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² QAxServer ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π‘ΠΠ. ΠΠΈΠΆΠ΅ ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ ΡΡΠΎ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IObjectSafety, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Internet Explorer Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. ΠΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ Π½Π΅ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Β«Object not safe for scriptingΒ» (ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π² ΡΡΠ΅Π½Π°ΡΠΈΠΈ) Π² Internet Explorer.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IObjectSafety:
01 class ObjectSafetyImpl : public QAxAggregated, public IObjectSafety
02 {
03 public:
04 long queryInterface(const QUuid &iid, void **iface);
05 QAXAGG_IUNKNOWN
06 HRESULT WINAPI GetInterfaceSafetyOptions(REFIID riid,
07 DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions);
08 HRESULT WINAPI SetInterfaceSafetyOptions(REFIID riid,
09 DWORD pdwSupportedOptions, DWORD pdwEnabledOptions);
10 };
ΠΠ»Π°ΡΡ ObjectSafetyImpl Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΊΠ°ΠΊ QAxAggregated, ΡΠ°ΠΊ ΠΈ IObjectSafety. ΠΠ»Π°ΡΡ QAxAggregated ΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΌ Π±Π°Π·ΠΎΠ²ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΌ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² Π‘ΠΠ. ΠΠ±ΡΠ΅ΠΊΡ Π‘ΠΠ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΡΠΈΡΡΠ΅Ρ QAxAggregated, Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ controllingUnknown(). ΠΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π‘ΠΠ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½Π΅Π·Π°ΠΌΠ΅ΡΠ½ΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ QAxServer.
ΠΠ°ΠΊΡΠΎΡ QAXAGG_IUNKNOWN ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ QueryInterface(), AddRef() ΠΈ Release(). Π ΡΡΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ ΠΏΡΠΎΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ² ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π‘ΠΠ.
01 long ObjectSafetyImpl::queryInterface(const QUuid &iid, void **iface)
02 {
03 *iface = 0;
04 if (iid == IID_IObjectSafety) {
05 *iface = static_cast<IObjectSafety *>(this);
06 } else {
07 return E_NOINTERFACE;
08 }
09 AddRef();
10 return S_OK;
11 }
Π€ΡΠ½ΠΊΡΠΈΡ queryInterface() β ΡΠΈΡΡΠ°Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠ»Π°ΡΡΠ° QAxAggregated. ΠΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π‘ΠΠ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠΎΠΌ QAxAggregated. ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ E_NOINTERFACE Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ, ΠΈ ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ IUnknown.
01 HRESULT WINAPI ObjectSafetyImpl::GetInterfaceSafetyOptions(
02 REFIID /* riid */, DWORD *pdwSupportedOptions,
03 DWORD *pdwEnabledOptions)
04 {
05 *pdwSupportedOptions =
06 INTERFACESAFE_FOR_UNTRUSTED_DATA
07 | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
08 *pdwEnabledOptions = *pdwSupportedOptions;
09 return S_OK;
10 }
11 HRESULT WINAPI ObjectSafetyImpl::SetInterfaceSafetyOptions(
12 REFIID /* riid */, DWORD /* pdwSupportedOptions */,
13 DWORD /* pdwEnabledOptions */)
14 {
15 return S_OK;
16 }
Π€ΡΠ½ΠΊΡΠΈΠΈ GetInterfaceSafetyOptions() ΠΈ SetInterfaceSafetyOptions() ΠΎΠ±ΡΡΠ²Π»ΡΡΡΡΡ Π² IObjectSafety. ΠΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΠΈΡ , ΡΡΠΎΠ±Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠΈΡΡ Π²ΡΠ΅Ρ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π½Π°Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΡΡΠ΅Π½Π°ΡΠΈΡΡ .
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ main.cpp:
01 #include <QAxFactory>
02 #include "axbouncer.h"
03 QAXFACTORY_DEFAULT(AxBouncer,
04 "{5e2461aa-a3e8-4f7a-8b04-307459a4c08c}",
05 "{533af11f-4899-43de-8b7f-2ddf588d1015}",
06 "{772c14a5-a840-4023-b79d-19549ece0cd9}",
07 "{dbce1e56-70dd-4f74-85e0-95c65d86254d}",
08 "{3f3db5e0-78ff-4e35-8a5d-3d3b96c83e09}")
ΠΠ°ΠΊΡΠΎΡ QAXFACTORY_DEFAULT() ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ActiveX. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² ActiveX, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ActiveX.
ΠΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΌΠ°ΠΊΡΠΎΡΠ° QAXFACTORY_DEFAULT() ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠΌΡ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Qt. Π’Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΊΡΠΏΠΎΡΡΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅: ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΊΠ»Π°ΡΡΠ°, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΠΎΠ±ΡΡΠΈΠΉ, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠΈΠΏΠΎΠ² ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ guidgen ΠΈΠ»ΠΈ uuidgen, Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ². ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π½Π°ΠΌ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΠΌΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΡ main().
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΡΠ°ΠΉΠ» .pro Π΄Π»Ρ Π²Π½ΡΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° ActiveX:
TEMPLATE = lib
CONFIG += dll qaxserver
HEADERS = axbouncer.h \
objectsafetyimpl.h
SOURCES = axbouncer.cpp \
main.cpp \
objectsafetyimpl.cpp
RC_FILE = qaxserver.rc
DEF_FILE = qaxserver.def
Π€Π°ΠΉΠ»Ρ qaxserver.rc ΠΈ qaxserver.def, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅ΡΡΡΡ ΡΡΡΠ»ΠΊΠΈ Π² ΡΠ°ΠΉΠ»Π΅ .pro, βΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ· ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Qt src\activeqt\control.
Π€Π°ΠΉΠ» makefile ΠΈΠ»ΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΡΠΈΠ»ΠΈΡΠΎΠΉ qmake ΡΠ°ΠΉΠ» ΠΏΡΠΎΠ΅ΠΊΡΠ° Visual Π‘++ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΠΏΡΠ°Π²ΠΈΠ»Π° Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° Π² ΡΠ΅Π΅ΡΡΡΠ΅ Windows. ΠΠ»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° ΠΌΠ°ΡΠΈΠ½Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈΠ»ΠΈΡΡ regsvr32, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Windows.
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΡΠ΅ΠΌ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Bouncer Π² ΡΡΡΠ°Π½ΠΈΡΡ HTML, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅Π³ <object>:
<object id="AxBouncer"
classid="clsid:5e2461aa-a3e8-4f7a-8b04-307459a4c08c">
<b>The ActiveX control is not available. Make sure you
have built and registered the component server.</b>
</object>
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΠ»ΠΎΡΠΎΠ²:
<input type="button" value="Start" onClick="AxBouncer.start()">
<input type="button" value="Stop" onClick="AxBouncer.stop()">
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΈΠ΄ΠΆΠ΅ΡΠΎΠΌ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ·ΡΠΊΠΎΠ² JavaScript ΠΈΠ»ΠΈ VBScript ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π»ΡΠ±ΡΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ActiveX (ΡΠΌ. ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅ ΡΠ°ΠΉΠ» demo.html, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ ActiveX.
ΠΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ β ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Address Book (Π°Π΄ΡΠ΅ΡΠ½Π°Ρ ΠΊΠ½ΠΈΠ³Π°), ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΠ΅Π΅ ΡΡΠ΅Π½Π°ΡΠΈΠΉ. ΠΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Qt Π΄Π»Ρ Windows ΠΈΠ»ΠΈ Π²Π½Π΅ΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° ActiveX. Π ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Visual Basic.
01 class AddressBook : public QMainWindow
02 {
03 Q_OBJECT
04 Q_PROPERTY(int count READ count)
05 Q_CLASSINFO("ClassID",
06 "{588141ef-110d-4beb-95ab-ee6a478b576d}")
07 Q_CLASSINFO("InterfaceID",
08 "{718780ec-b30c-4d88-83b3-79b3d9e78502}")
09 Q_CLASSINFO("ToSuperClass", "AddressBook")
10 public:
11 AddressBook(QWidget *parent = 0);
12 ~AddressBook();
13 int count() const;
14 public slots:
15 ABItem *createEntry(const QString &contact);
16 ABItem *findEntry(const QString &contact) const;
17 ABItem *entryAt(int index) const;
18 private slots:
19 void addEntry();
20 void editEntry();
21 void deleteEntry();
22 private:
23 void createActions();
24 void createMenus();
25 QTreeWidget *treeWidget;
26 QMenu *fileMenu;
27 QMenu *editMenu;
28 QAction *exitAction;
29 QAction *addEntryAction;
30 QAction *editEntryAction;
31 QAction *deleteEntryAction;
32 };
ΠΠΈΠ΄ΠΆΠ΅Ρ AddressBook ΡΠ²Π»ΡΠ΅ΡΡΡ Π³Π»Π°Π²Π½ΡΠΌ ΠΎΠΊΠ½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ ΠΈΠΌ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΈ ΡΠ»ΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΡΠ΅Π½Π°ΡΠΈΡ. ΠΠ°ΠΊΡΠΎΡ Q_CLASSINFO() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ° ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ², ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ. ΠΠ½ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°ΠΊΠΈΡ ΡΡΠΈΠ»ΠΈΡ, ΠΊΠ°ΠΊ guid ΠΈΠ»ΠΈ uuid.
Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ»ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΊΠ»Π°ΡΡΠ° ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΏΡΠΈ ΡΠΊΡΠΏΠΎΡΡΠ΅ ΠΊΠ»Π°ΡΡΠ° QAxBouncer, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠ°ΠΊΡΠΎΡ QAXFACTORY_DEFAULT(). Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΡ QAXFACTORY_DEFAULT(). ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ Π΄Π²ΡΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ:
β’ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ QAxFactory, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΅Π³ΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ± ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΡΡ Π½Π°ΠΌΠΈ ΡΠΈΠΏΠ°Ρ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΡ QAXFACTORY_EXPORT() Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠ°Π±ΡΠΈΠΊΠΈ ΠΊΠ»Π°ΡΡΠΎΠ²;
β’ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΡΡ QAXFACTORY_BEGIN(), QAXFACTORY_END(), QAXCLASS() ΠΈ QAXTYPE() Π΄Π»Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠ°Π±ΡΠΈΠΊΠΈ ΠΊΠ»Π°ΡΡΠΎΠ². Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΡ Q_CLASSINFO() Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ° ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
ΠΠ΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° AddressBook. Π’ΡΠ΅ΡΠΈΠΉ Π²ΡΠ·ΠΎΠ² ΠΌΠ°ΠΊΡΠΎΡΠ° Q_CLASSINFO() ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Π½Π½ΡΠΌ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ActiveX ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π² ΡΠ°ΡΠΏΠΎΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΡΠΈΠ³Π½Π°Π»Ρ ΠΈ ΡΠ»ΠΎΡΡ, Π½ΠΎ ΠΈ ΡΠ²ΠΎΠΈ ΡΡΠΏΠ΅ΡΠΊΠ»Π°ΡΡΡ Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ QWidget. ΠΡΡΠΈΠ±ΡΡ ToSuperClass ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΡΠΏΠ΅ΡΠΊΠ»Π°ΡΡ ΡΠ°ΠΌΠΎΠ³ΠΎ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ (Π² Π΄Π΅ΡΠ΅Π²Π΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ), ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ. ΠΠ΄Π΅ΡΡ ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° (Β«AddressBookΒ») Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠΌΠ΅Π½ΠΈ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠ°ΠΌΠΎΠ³ΠΎ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ β ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π½Π΅ Π±ΡΠ΄ΡΡ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΡΠΈΠ³Π½Π°Π»Ρ ΠΈ ΡΠ»ΠΎΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π² ΡΡΠΏΠ΅ΡΠΊΠ»Π°ΡΡΠ°Ρ AddressBook.