[ Pobierz całość w formacie PDF ]
.Do ich implementacji u¿yliœmy mianowicie funkcjiAtlAdvise() i AtlUnadvise() pochodz¹cych z biblioteki ATL.Przepis na definiowanie w³asnej klasy reprezentuj¹cej ujœcie zdarzeñ na bazieszablonu TCustomSink jest nastêpuj¹cy:Nale¿y zdefiniowaæ obiekt COM na bazie klas CComObjectRootEx (alboCComObjectRoot) oraz CComCoClass.Nale¿y uczyniæ implementowany interfejs zdarzenia kolejn¹ klas¹ bazow¹ obiektui oczywiœcie stworzyæ implementacjê metod tego interfejsu.Zdefiniowaæ typ w³asnego ujœcia zdarzeñ, na przyk³ad:typedef TCustomSink TMyCreatableSink;Ilustracj¹ powy¿szego przepisu jest wydruk 12.18, na którym przedstawiono klasêTDetailedZodiacSinkImpl implementuj¹c¹ ujœcie zdarzeñ ZodiacCustomSink dlainterfejsu IDetailedZodiacEvents.Zawartoœæ tego wydruku znajduje siê w plikuZodiacCustomSink.h na za³¹czonej p³ycie CD-ROM.Wydruk 12.18.Deklaracja klasy implementuj¹cej ujœcie zdarzeñ dla interfejsuIDetailedZodiacEvents#if !defined(ZODIACCUSTOMSINK_H__)#define ZODIACCUSTOMSINK_H__#include#include#include#include#include#include "CustomSinks.h"#include "ZodiacServer_TLB.h"typedef void __fastcall (__closure * TDetailedZodiacSignReadyEvent)(TDetailedZodiacSign& DetailedSign);//---------------------------------------------------------------------------// Klasa implementuj¹c¹ interfejs IDetailedZodiacEventsclass ATL_NO_VTABLE TDetailedZodiacSinkImpl :public CComObjectRootEx,public CComCoClass,public IDetailedZodiacEvents{public:TDetailedZodiacSinkImpl() :FOnDetailedZodiacSign(NULL){}DECLARE_THREADING_MODEL(otApartment);BEGIN_COM_MAP(TDetailedZodiacSinkImpl)COM_INTERFACE_ENTRY(IDetailedZodiacEvents)END_COM_MAP()protected:// WskaŸnik funkcji zdarzeniowejTDetailedZodiacSignReadyEvent FOnDetailedZodiacSign;public:__property TDetailedZodiacSignReadyEvent OnDetailedZodiacSign ={ read = FOnDetailedZodiacSign, write = FOnDetailedZodiacSign };// IDetailedZodiacEventspublic:STDMETHOD(OnDetailedZodiacSignReady(TDetailedZodiacSign* DetailedSign)){if (FOnDetailedZodiacSign != NULL)FOnDetailedZodiacSign(*DetailedSign);return S_OK;}};typedef TCustomSinkTZodiacCustomSink;#endif //ZODIACCUSTOMSINK_H__Czytelnicy spostrzegli zapewne, i¿ do budowy aplikacji klienta u¿yliœmy tychsamych klas i makr biblioteki ATL, z których korzystaliœmy ju¿ przy budowieserwera.Jest tu jednak pewna ró¿nica – nie jest konieczne tworzenie mapy COM,bowiem aplikacja klienta nie bêdzie tworzyæ egzemplarzy obiektu COM; z tegosamego powodu nieistotny jest CLSID tego¿ obiektu, dlatego te¿ zamiast niegou¿yliœmy zerowego identyfikatora CLSID_NULL.Maj¹c ju¿ zdefiniowan¹ klasê TZodiacCustomSink, nale¿y zrobiæ z niej u¿ytek wprojekcie aplikacji – klienta.Podobnie jak w przypadku klasy TZodiacSink,nale¿y najpierw dodaæ odpowiednie pole do formularza g³Ã³wnego:private:…TZodiacCustomSink FZodiacCustomSink;Nastêpnie nale¿y zdefiniowaæ metodê formularza, obs³uguj¹c¹ zdarzenie:OnDetailedZodiacSignReady:void __fastcall TMainForm::OnDetailedZodiacSignReady(TDetailedZodiacSign& DetailedSign){memLog->Lines->Add(_T("Zodiac detailed information (ASYNCHRONOUS):"));memLog->Lines->Add(_T(" Sign = ") + AnsiString(DetailedSign.Sign));memLog->Lines->Add(_T(" House = ") + IntToStr(DetailedSign.House));memLog->Lines->Add(_T(" Type = ") + AnsiString(DetailedSign.Element));memLog->Lines->Add(_T(" Planet = ") + AnsiString(DetailedSign.Planet));memLog->Lines->Add(_T(" Details = ") + AnsiString(DetailedSign.Details));memLog->Lines->Add(_T(" Tip = ") + AnsiString(DetailedSign.Advice));memLog->Lines->Add(_T(""));}po czym zwi¹zaæ tê metodê z odpowiednim zdarzeniem klasy wskazywanej przez poleFZodiacCustomSink oraz zapewniæ automatyczne po³¹czenie z serwerem, dopisuj¹cdo funkcji zdarzeniowej TMainForm::FormCreate nastêpuj¹c¹ sekwencjêinstrukcji:FZodiacCustomSink.OnDetailedZodiacSign = OnDetailedZodiacSignReady;FZodiacCustomSink.Connect(FZodiac);Na tym ostatecznie zakoñczyliœmy budowê aplikacji klienta – i jednoczeœnieprezentacjê projektów ilustruj¹cych podstawowe elementy technologii COM.Literatura zalecanaCzytelnikom zainteresowanym szczegó³ami technologii COM i jej zwi¹zkami zC++Builderem Autorzy wydania oryginalnego polecaj¹ nastêpuj¹ce pozycje:Na temat programowania w C++Builderze:Kent Reisdorph i in.C++Builder 4 Unleashed, wyd.Sams Publishing 1999,ISBN 0-672-31510-6;Na temat technologii COM/COM+:Dale Rogerson Inside COM, wyd.Microsoft Press 1997,ISBN 1-57231-349-8;Guy Eddon, Henry Eddon Inside Distributed COM, wyd.Microsoft Press 1998,ISBN 1-57231-849-X;David S.Platt Understanding COM+, wyd.Microsoft Press 1999,ISBN 0-7356-0666-8;Ash Rofail, Yasser Shohoud Mastering COM and COM+, wyd.Sybex Inc.,ISBN 0-7821-2384-8;Na temat szczegó³Ã³w biblioteki ATL:Brent Rector, Chris Sells ATL Internals, wyd.Addison Wesley 1999,ISBN 0-201-69589-8;O ciekawych zagadnieniach pokrewnych:Eric Harmon Delphi COM Programming, wyd.Macmillan Technical Publishing 2000,ISBN 1-57870-221-6;Zasoby internetowe:nntp://forums.inprise.com/borland.public.cppbuilder.activex;http://community.borland.com/cpp;http://www.cetus.links.org/oo_ole.html;http://www.techvanguards.com;http://msdn.microsoft.com.Byæ mo¿e HELION bêdzie chcia³ zweryfikowaæ tê listê lub coœ do niej dodaæ.PodsumowanieTechnologia COM nie stanowi zamkniêtej ca³oœci.Tworzenie komponentów COM napotrzeby np.przetwarzania du¿ych baz danych, sterowania urz¹dzeniami itp.staje siê czynnoœci¹ w miarê nieskomplikowan¹ dopiero wówczas, gdy potraktujesiê narzêdzie projektowe (C++Builder) jako ca³oœæ, nie zaœ tylko pod k¹tem ichwspó³pracy z mechanizmami COM.W tym rozdziale zaprezentowaliœmy wykorzystanie elementów COM na gruncieC++Buildera, tworz¹c dwie wspó³pracuj¹ce ze sob¹ aplikacje – serwer i klient [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • listy-do-eda.opx.pl