Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 107

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

Π£ΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ свойства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 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.