[ Pobierz całość w formacie PDF ]
.C++), może byćróżny od języka, w którym chcemy uzyskać jej importowaną wersję (np.Object Pascala).Podstawowym powodem, dla którego udostępnia się biblioteki typów, jest możliwość uzyskaniaspecyficznych dla danego języka deklaracji używanych typów i komponentów komponenty stają sięwówczas samodokumentujące i to na dowolnej platformie projektowej (o ile, rzecz jasna, posiada onafunkcje importowania bibliotek typów). 32Przegląd wygenerowanych konstrukcji C++Przyjrzyjmy się bliżej plikowi ZodiacServer_TLB.h, wygenerowanemu przez kreator importowy izawierającemu deklarację używanych przez bibliotekę koklas i interfejsów.Wydruk 12.11 przedstawiafragment tego pliku dotyczący interfejsów IZodiac i IDetailedZodiac.Wydruk 12.11.Deklaracje interfejsów IZodiac i IDetailedZodiac w plikuZodiacServer_TLB.h&&interface IZodiac : public IDispatch{public:virtual HRESULT STDMETHODCALLTYPE GetZodiacSign(long Day/*[in]*/,long Month/*[in]*/,BSTR* Sign/*[out,retval]*/) = 0; // [1]virtual HRESULT STDMETHODCALLTYPE GetZodiacSignAsync(long Day/*[in]*/,long Month/*[in]*/) = 0; // [2]#if !defined(__TLB_NO_INTERFACE_WRAPPERS)BSTR __fastcall GetZodiacSign(long Day/*[in]*/, long Month/*[in]*/){BSTR Sign = 0;OLECHECK(this->GetZodiacSign(Day, Month, (BSTR*)&Sign));return Sign;}#endif // __TLB_NO_INTERFACE_WRAPPERS};&&interface IDetailedZodiac : public IUnknown{public:virtual HRESULT STDMETHODCALLTYPE GetDetailedZodiacSign(long Day/*[in]*/,long Month/*[in]*/,Zodiacserver_tlb::TDetailedZodiacSign*DetailedSign/*[out]*/) = 0; // [1]virtual HRESULT STDMETHODCALLTYPE GetDetailedZodiacSignAsync(long Day/*[in]*/, long Month/*[in]*/) = 0; // [2]};& 33&Nietrudno zauważyć informację o pochodzeniu obydwu interfejsów: IZodiac, jako interfejs dualny,wywodzi się z IDispatch, natomiast klasyczny interfejs IDetailedZodiac wywodzi się zIUnknown.W ramach interfejsu IZodiac widzimy również drugą, przeciążoną postać metodyGetZodiacSign().Wynikowy łańcuch jest tutaj wprost wynikiem funkcji, w odróżnieniu odpierwotnego aspektu, przekazującego ów łańcuch przez trzeci parametr, rezerwując dla wyniku (typuHRESULT) informację o powodzeniu lub niepowodzeniu operacji.Drugi, przeciążony aspekt funkcji itak korzysta z owego pierwotnego aspektu, kontrolując poprawność jego wywołania (tj.zwróceniewartości 0) za pomocą makra OLECHECK.Niestety, makro OLECHECK implementowane jest jako połączenie obsługi błędów z generowaniemasercji, nie wykorzystując przy tym interfejsu IErrorInfo, którego metody serwer mógłbyimplementować (jak czyni to serwer ZodiacServer).Produkowany przez makro komunikat,zawierający werbalny opis zaistniałego wyjątku, jest więc raczej użyteczny jedynie dla celówśledzenia aplikacji, nie zaś dla potrzeb projektanta aplikacji COM.Jako alternatywę dla makra OLECHECK umieściliśmy na załączonej płycie CD-ROM plikComThrow.h, zawierający kilka map przydatnych w obsłudze błędów zaistniałych w aplikacjachCOM.Oprócz implementacji wspomnianych makr plik ten zawiera również opis ich użycia wraz zprostymi przykładami.Aby uprościć projektowanie aplikacji klienta, zamiast bezpośrednich odwołań do interfejsówzastosowaliśmy specjalne klasy szablony, stanowiące dla tych interfejsów swoiste otoczki i z tegowzględu zwane eleganckimi interfejsami (ang.smart interfaces) zamiast bowiem interfejsów mamydo czynienia z wygodniejszymi klasami C++.Przykład takiego eleganckiego interfejsu TCOMIZodiac przedstawia wydruk 12.12.Wydruk 12.12.Deklaracja eleganckiego interfejsu TCOMIZodiactemplateclass TCOMIZodiacT : public TComInterface, publicTComInterfaceBase{public:TCOMIZodiacT() {}TCOMIZodiacT(IZodiac *intf, bool addRef = false) : TComInterface(intf,addRef) {}TCOMIZodiacT(const TCOMIZodiacT& src) : TComInterface(src) {}TCOMIZodiacT& operator=(const TCOMIZodiacT& src) { Bind(src, true); return*this;}HRESULT __fastcall GetZodiacSign(long Day/*[in]*/,long Month/*[in]*/,BSTR* Sign/*[out,retval]*/);BSTR __fastcall GetZodiacSign(long Day/*[in]*/,long Month/*[in]*/);HRESULT __fastcall GetZodiacSignAsync( 34long Day/*[in]*/,long Month/*[in]*/);};typedef TCOMIZodiacT TCOMIZodiac;TCOMIZodiac jest konkretyzacją szablonu TCOMIZodiacT; cenę płaconą za wygodę użytkowaniastanowi tu kilka dodatkowych metod i operatorów.Najważniejsze z operatorów dziedziczone są zszablonu TComInterface, którego konkretyzacja TComInterface jest jednym zprzodków klasy TCOMIZodiacT
[ Pobierz całość w formacie PDF ]