Delphi __ Kompendium __ Roz13.pdf

(1951 KB) Pobierz
Delphi :: Kompendium :: Roz...
Delphi :: Kompendium :: Rozdział 13 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_13
Logowanie | Rejestracja | Forum | Pomoc | Reklama | Szukaj
Strona główna :: Delphi :: Kompendium
Rozdział 13
Edytuj Historia
Delphi
Artykuły
Kompendium
Gotowce
FAQ
.NET
Turbo Pascal
FAQ
PHP
FAQ
Java
FAQ
C/C++
Artykuły
FAQ
C#
Wprowadzenie
Assembler
FAQ
(X)HTML
CSS
JavaScript
Z pogranicza
Algorytmy
WIĘCEJ »
COM i ActiveX
W tym rozdziale zajmiemy się dość specyficznym aspektem programowania, stworzonym przez firmę Microsoft
i nadal z nią kojarzonym ? projektowaniem kontrolek COM i ActiveX. Dowiesz się, do czego służą kontrolki
ActiveX, jak je tworzyć i jak ich używać.
Spis treści
1 Czym jest COM?
1.1 Kontrolka w rozumieniu COM
1.2 Odrobinę historii
2 Tworzenie obiektów COM
3 Metody i właściwości
3.1 Dodawanie metod
3.1.1 Parametry nowej metody
3.1.2 Wartość zwrotna funkcji
3.2 Dodawanie właściwości
4 Kod źródłowy kontrolki
5 Budowa i rejestracja kontrolki
6 Wykorzystanie obiektu COM
7 Interfejsy
7.1 GUID
8 ActiveX
9 Import kontrolek ActiveX
9.1 Wykorzystanie kontrolki TVText
10 Tworzenie kontrolek ActiveX
11 Przykład: wyświetlanie napisów do filmu
11.1 Tworzenie interfejsu COM
11.2 Tworzenie kontrolki ActiveX
11.2.1 Strona wizualna
11.2.2 Kod źródłowy kontrolki
11.3 Budowa i rejestracja
12 ActiveX w Internecie
12.1 Względy bezpieczeństwa
12.2 Przykładowa kontrolka
12.2.1 Tworzenie kontrolki ActiveX
12.2.2 Publikowanie kontrolki
13 Podsumowanie
Delphi
C/C++
Turbo Pascal
Assembler
PHP
Programy
Dokumentacja
Kursy
Komponenty
WIĘCEJ »
Czym jest COM?
Rozwinięciem angielskiego skrótu COM jest nazwa Component Object Model (obiektowy
model komponentów). Jest to specyfikacja firmy Microsoft, która w założeniu dotyczy
tworzenia obiektów wielokrotnego użytku, niezależnie od języka programowania.
Aby zrozumieć ActiveX, musisz poznać COM ? postaram się zwięźle Ci to wytłumaczyć. Otóż firma Microsoft
stworzyła model obiektów, które wykorzystywane mogą być w każdym środowisku programistycznym Win32.
Wynikiem powstania obiektu COM jest kontrolka ? plik z rozszerzeniem .ocx. Kontrolka taka może być
wykorzystana zarówno w Delphi, jak i Visual C++, C++ Builder czy Visual Basic.
Na razie obiekty COM są jedynie obiektami działającymi w różnych środowiskach Windows ? niemożliwe jest
wykorzystanie ich poza tym systemem.
Kontrolka w rozumieniu COM
W tym rozdziale będę używał słowa ?kontrolka? w znaczeniu obiektu COM. Do tej pory to słowo kojarzyło Ci się
zapewne z komponentem Delphi. Można powiedzieć, że obiekty COM są takim uniwersalnym komponentem,
podobnym do biblioteki DLL. Raz utworzona kontrolka może być wykorzystywana wiele razy, przez wielu
programistów oraz w różnych środowiskach programowania. Jeżeli ktoś już napisał kontrolkę spełniającą daną
funkcję, to po co wyważać otwarte drzwi i tworzyć jeszcze raz to samo? Przykładem może być przeglądarka
WWW. Napisanie programu analizującego kod HTML jest niezwykle czasochłonnym i żmudnym zadaniem.
Niekiedy jednak w naszym programie konieczne staje się wyświetlenie jakiegoś dokumentu w formie strony
WWW. Dzięki technologii COM i ActiveX (o ActiveX powiemy nieco później) możemy zaimportować
udostępnione przez twórców przeglądarki obiekty COM i wykorzystać je w programie jako dodatkowy
komponent.
Odrobinę historii
COM jest technologią stosunkowo nową, bo powstałą kilka lat temu. Wprowadzenie jej miało na celu
stworzenie jednolitego standardu komunikacji, tak aby np. (by jeszcze raz posłużyć się powyższym
przykładem) programiści mogli korzystać z możliwości przeglądania stron WWW w swoich aplikacjach. Firma
Microsoft wyszła naprzeciw temu zadaniu i utworzyła moduł obiektów (COM), który umożliwia udostępnianie
innym aplikacjom swoich metod.
W przypadku Delphi zaimportowana kontrolka COM staje się jakby komponentem, umieszczonym na palecie
komponentów. Wówczas w dość prosty sposób można skorzystać z zalet takiego obiektu, wywołując zawarte w
nim metody.
1 z 19
2009-03-14 15:44
77981887.008.png 77981887.009.png 77981887.010.png 77981887.011.png 77981887.001.png 77981887.002.png
Delphi :: Kompendium :: Rozdział 13 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_13
Tworzenie obiektów COM
RSS | Forum | Pastebin |
Regulamin | Pomoc | Usuń
cookies | Prawa autorskie |
Kontakt | Reklama
1. Z menu File wybierz New/New/Other . Pojawi się Repozytorium. Zaznacz zakładkę ActiveX (rysunek 13.1).
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 3.2581 sek. (zapytań SQL:
12)
Rysunek 13.1. Zakładka ActiveX Repozytoriumv
2. Zaznacz w tym oknie ikonę ActiveX Library i naciśnij OK. W tym momencie zostanie utworzony pusty
projekt.
3. Z menu File wybierz polecenie Save . Wskaż miejsce, gdzie Delphi ma zapisać plik.
Utworzyliśmy właśnie pusty projekt, ale na razie do niczego nam to nie służy. Utworzenie właściwego obiektu
COM też jest proste ? polega na wybraniu ikony COM Object.
Ponownie wybierz polecenie File/New/Other , a w zakładce ActiveX tym razem wybierz pozycję COM Object.
Delphi wyświetli okno kreatora obiektów COM, widoczne na rysunku 13.2.
Rysunek 13.2. Kreator obiektów COM
W polu Class Name (nazwa kontrolki) wpisz XorCode . Pole Description służy do wstawienia krótkiego opisu
obiektu. Możesz wpisać np. Kodowanie metodą XOR . Klikając przycisk OK, zamknij okno.
Obiekt COM został utworzony. Z menu File wybierz Save All i wpisz nazwę modułu.
Na pierwszym planie znajduje się okno edytora biblioteki typu (rysunek 13.3). Za pomocą tego edytora
sterujemy obiektem COM. Wszystkie zmiany dokonane w tym edytorze znajdą odzwierciedlenie w module, lecz
tym zajmiemy się nieco później.
2 z 19
2009-03-14 15:44
77981887.003.png 77981887.004.png
Delphi :: Kompendium :: Rozdział 13 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_13
Rysunek 13.3. Okno edytora biblioteki typu
Metody i właściwości
Tak, jak zwykły komponent posiada różne metody i właściwości, za pomocą których możemy ?sterować? ich
zachowaniem, tak metody są obecne również w kontrolce COM.
Dodawanie metod
Dodawanie metod oraz właściwości jest czynnością w miarę prostą. Zadanie opiera się na umiejętnym
wykorzystaniu edytora (rysunek 13.4). W gałęzi po lewej znajduje się pozycja IXorCode ? kliknij ją prawym
klawiszem myszy i z menu wybierz New/Method .
Rysunek 13.4. Dodawanie nowej metody
Po wybraniu pozycji Method będziesz musiał podać nazwę naszej metody ? wpisz słowo Code , co spowoduje
pojawienie się nowej gałęzi. Operowanie na nowej metodzie odbywa się poprzez zakładki, które pojawią się po
prawej stronie (rysunek 13.5).
Rysunek 13.5. Zakładki służące do zmiany opcji metody
3 z 19
2009-03-14 15:44
77981887.005.png
Delphi :: Kompendium :: Rozdział 13 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_13
Parametry nowej metody
Ustalenia parametrów naszej funkcji oraz typu wartości przez nią zwracanej można dokonać w zakładce
Parameters . Nasza kontrolka będzie służyła do kodowania tekstu metodą XOR (metodę tę opiszę nieco później)
? a zatem będzie nam potrzebna tylko jedna metoda, która nie posiada parametrów. Warto jednak wiedzieć, jak
się tworzy parametry.
Parametry zaznaczonej metody prezentowane są w zakładce Parameters w ramce Parameters (rysunek 13.6).
Rysunek 13.6. Ustawianie parametru dla metody
W pierwszej kolumnie należy wpisać nazwę parametru, a w kolejnej jego typ; natomiast w trzeciej możemy
określić, czy parametr ma być wejściowy czy też wyjściowy. Klikając przycisk Add , możemy dodać kolejny
parametr.
Wartość zwrotna funkcji
W naszym przykładzie nie interesują nas żadne parametry funkcji, gdyż domyślnie nie są nam potrzebne.
Jedyna ważna kwestia to wartość zwrotna funkcji, którą możemy ustawić za pomocą listy rozwijalnej Return
Type . Rozwiń ową listę i wybierz lpstr , co oznacza wartość typu PChar .
Zapisz projekt, aby zmiany dokonane w edytorze zostały odzwierciedlone w kodzie.
System Windows był pisany w języku C, stąd na liście rozwijalnej nie można dostrzec
żadnych typów charakterystycznych dla Object Pascala. W języku C nie ma takiego typu jak
PChar ? można korzystać jedynie z lpstr .
Dodawanie właściwości
W naszej przykładowej kontrolce skorzystamy przy pisaniu procedury kodującej z dwóch zmiennych
(właściwości) ? kodowanego łańcucha oraz hasła. Musimy mieć więc dwie właściwości.
Kliknij prawym przyciskiem myszy pozycję IXorCode i (podobnie jak w przypadku tworzenia właściwości)
wybierz właściwość New/Properties . Stwórz w ten sposób dwie właściwości ? lpString oraz lpPassword . Nie
przejmuj się, że zostały stworzone tym samym po dwie gałęzie dla każdej właściwości. Domyślnie zakłada się
bowiem, że jedna z nich potrzebna jest do zapisywania danych do właściwości, a druga do ich odczytu. My
jednak potrzebujemy właściwości ?tylko do zapisu?, więc jedną możemy bez obaw usunąć. Po zaznaczeniu
konkretnej pozycji na zakładce Attributes znajdzie się pole Invoke Kind , a w nim wartość Property Put albo
Property Get . Możesz usunąć klucze, w których jest Property Get , klikając prawym przyciskiem myszy element,
który chcesz skasować, a następnie wybierając polecenie Delete .
Kolejnym krokiem jest ustawienie odpowiednich wartości.
Zaznacz pozycję lpString .
2.
Odszukaj pozycję Return Type i z listy wybierz void .
4.
Następnie ustaw parametr ? nadaj mu typ LPSTR .
To samo zrób z kluczem lpPassword .
Dzięki temu w kontrolce mamy dwie właściwości, które służyć będą tylko do zapisu. Napisałem ?właściwości?,
ale w rzeczywistości w kodzie programu widnieją dwie procedury:
procedure TXorCode. Set_lpString ( Value: PChar ) ;
begin
end ;
procedure TXorCode. Set_lpPassword ( Value: PChar ) ;
begin
end ;
Cóż, taka jest zasada tworzenia kontrolek COM. Użytkownik wykorzystujący ową kontrolkę, chcąc nadać
właściwości nową wartość, w rzeczywistości wywołuje np. procedurę Set_lpPassword , przekazując wartość w
parametrze Value .
Kod źródłowy kontrolki
Zmian dokonujemy za pośrednictwem edytora, który w tle generuje kod źródłowy dla kontrolki. Oprócz
standardowego kodu źródłowego kontrolki Delphi tworzy także plik z tzw. interfejsami. Plik taki można łatwo
rozpoznać po końcówce _TLB, dodanej do nazwy pliku. Zajrzyj do katalogu, w którym zapisałeś projekt ? na
4 z 19
2009-03-14 15:44
1.
3.
Kliknij zakładkę Parameters .
77981887.006.png
Delphi :: Kompendium :: Rozdział 13 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_13
pewno znajduje się tam plik XorCode_TLB.pas lub inny (jeżeli nadałeś inną nazwę). W listingu 13.1
zaprezentowałem kod tego pliku.
Listing 13.1. Kod źródłowy biblioteki
unit XorCode_TLB;
// ************************************************************************ //
// WARNING
// -------
// The types declared in this file were generated from data read from a
// Type Library. If this type library is explicitly or indirectly (via
// another type library referring to this type library) re-imported, or the
// 'Refresh' command of the Type Library Editor activated while editing the
// Type Library, the contents of this file will be regenerated and all
// manual modifications will be lost.
// ************************************************************************ //
// PASTLWTR : 1.2
// File generated on 03-02-04 15:22:45 from Type Library described below.
// ************************************************************************ //
// Type Lib: C:\Moje dokumenty\Pliki textowe\delphi_kompendium_programisty\listingi\13\XorCode
\XorCode.tlb (1)
// LIBID: {356B1880-384C-11D7-A2DC-00E04CE92EC6}
// LCID: 0
// Helpfile:
// HelpString: XorCode Library
// DepndLst:
// (1) v2.0 stdole, (C:\WINDOWS\SYSTEM\STDOLE2.TLB)
// ************************************************************************ //
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface
uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:
// Type Libraries : LIBID_xxxx
// CoClasses : CLASS_xxxx
// DISPInterfaces : DIID_xxxx
// Non-DISP interfaces: IID_xxxx
// *********************************************************************//
const
// TypeLibrary Major and minor versions
XorCodeMajorVersion = 1 ;
XorCodeMinorVersion = 0 ;
LIBID_XorCode: TGUID = '{356B1880-384C-11D7-A2DC-00E04CE92EC6}' ;
IID_IXorCode: TGUID = '{356B1881-384C-11D7-A2DC-00E04CE92EC6}' ;
CLASS_XorCode: TGUID = '{356B1883-384C-11D7-A2DC-00E04CE92EC6}' ;
type
// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
IXorCode = interface ;
// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
XorCode = IXorCode;
// *********************************************************************//
// Interface: IXorCode
// Flags: (256) OleAutomation
// GUID: {356B1881-384C-11D7-A2DC-00E04CE92EC6}
// *********************************************************************//
IXorCode = interface ( IUnknown )
[ '{356B1881-384C-11D7-A2DC-00E04CE92EC6}' ]
function Code: PChar ; stdcall ;
procedure Set_lpString ( Value: PChar ) ; stdcall ;
procedure Set_lpPassword ( Value: PChar ) ; stdcall ;
end ;
// *********************************************************************//
// The Class CoXorCode provides a Create and CreateRemote method to
// create instances of the default interface IXorCode exposed by
// the CoClass XorCode. The functions are intended to be used by
// clients wishing to automate the CoClass objects exposed by the
// server of this typelibrary.
// *********************************************************************//
CoXorCode = class
class function Create: IXorCode;
class function CreateRemote ( const MachineName: string ) : IXorCode;
end ;
implementation
uses ComObj;
class function CoXorCode. Create : IXorCode;
begin
Result := CreateComObject ( CLASS_XorCode ) as IXorCode;
end ;
class function CoXorCode. CreateRemote ( const MachineName: string ) : IXorCode;
begin
Result := CreateRemoteComObject ( MachineName, CLASS_XorCode ) as IXorCode;
5 z 19
2009-03-14 15:44
77981887.007.png
Zgłoś jeśli naruszono regulamin