Jak utworzyć bibliotekę DLL (wprowadzenie)      Strona 6 z 7        Dalej
w oparciu o materiały ze stron The Bits

       Krok 6: Korzystanie z biblioteki DLL w programie

      Uruchom C++Builder'a, napiszemy teraz program testujący. Jeśli projekt DLL-a jest wciąż otwarty, zamknij go. Potem wybierz File|New Application, pojawi się dobrze ci znany pusty formularz. Na formularzu umieść: 3 etykiety (Label), 3 pola edycyjne (Edit), i 3 przyciski (Button). Ustaw je w szeregach: Label1 z Edit1; Label2 z Edit2; Label3 z Edit3. Przyciski rozmieść w dowolnych miejscach. Pozmieniaj odpowiednie właściwości, aby odpowiadały tym z poniższej tabelki. Zapisz projekt w katalogu TESTPROG, używając domyślnych nazw plików (unit1.cpp, project1.bpr). Nazwy komponentów niech zostaną domyślne. Zapisz projekt w katalogu TESTPROG z domyślnymi nazwami. A o to i tabelka:

Komponent Właściwość Wartość
Label1 Caption Pierwsza liczba:
Label2 Caption Druga liczba:
Label3 Caption Wynik:
Button1 Caption &Wersja
Button2 Caption &Formularz
Button3 Caption &Koniec
Edit1 MaxLength 5
  Text 123
Edit2 MaxLength 5
  Text 456
Edit3 Text ""
  Enabled False
  ReadOnly True


      Musimy zaprogramować obsługę zdarzeń OnClick dla trzech przycisków. Button1 będzie miał za zadanie wydobyć z biblioteki DLL numer jej wersji, który wyświetli się w polu Edit3. Button2 przekaże zawartość dwóch pól edycyjnych do funkcji Add2 (będącej w bibliotece DLL), oraz wyświetli zwróconą sumę w Edit3.

      Z kolei Button3 obsłuży wyjście z programu. Poniżej masz źródło programu zgodne z domyślnymi nazwami komponentów:

 //-----------------------------------------------------

 #include <vcl.h>

 #include <stdlib.h>

 #pragma hdrstop

 #include "Unit1.h"

 //------------------------------------------------------

 #pragma package(smart_init)

 #pragma resource "*.dfm"

 TForm1 *Form1;



 extern "C" __declspec(dllimport) void VerNo(short int*,
                                             short int*);

 extern "C" __declspec(dllimport) bool Add2(char*,
                                       char*, long int*);

 //------------------------------------------------------

 __fastcall TForm1::TForm1(TComponent* Owner)

 : TForm(Owner)

 {

 }

 //-------------------------------------------------------

 void __fastcall TForm1::Button1Click(TObject *Sender)

 {

 short int iMajor, iMinor;

 VerNo(&iMajor, &iMinor);

 Edit3->Text = "Wersja: " + (AnsiString)iMajor +
                             "." + (AnsiString)iMinor;

 }

 //----------------------------------------------------

 void __fastcall TForm1::Button2Click(TObject *Sender)

 {

 long int Total;

 if (Add2(Edit1->Text.c_str(), Edit2->Text.c_str(), &Total))

 Edit3->Text = (AnsiString)(int)Total;

 else Edit3->Text = "Użytkownik anulował!";

 }

 //------------------------------------------------------

 void __fastcall TForm1::Button3Click(TObject *Sender)

 {

 exit(0);

 }

 //----------------------------------------------------
      Zwróć uwagę na następujące deklaracje funkcji DLL-a:

 extern "C" __declspec(dllimport) void VerNo(short int *,short int *);

 extern "C" __declspec(dllimport) bool Add2(char *,char *,long int *);
      Zauważ że obie są prawie identyczne z tymi w bibliotece, za wyjątkiem że teraz mówimy Builder'owi, iż są one importowane (dllimport). Builder musi wiedzieć gdzie te funkcje się znajdują. Jeśli teraz spróbujesz uruchomić projekt, to Builder wyświetli błąd, gdyż nie zna jeszcze ich lokalizacji w DLL-u.

      Aby temu zaradzić, musimy kazać Builder'owi korzystać z biblioteki importowej, którą wcześniej utworzyliśmy w Kroku 5. A robi się to tak:

      Wybierz Project/Add to Project.

      W polu Pliki typu: zmień na Library file (*.lib). Wyświetli się plik TUTORIAL.LIB, kliknij go podwójnie a Builder doda go do projektu.

      Aby to sprawdzić, wybierz Project/View Makefile. Zobaczysz coś podobnego do tego poniżej:

 # ---------------------------------------------------------

 !if !$d(BCB)

 BCB = $(MAKEDIR)\..

 !endif

 # ------------------------------------------------------------

 # IDE SECTION

 # ---------------------------------------------------------
 
 # The following section of the project makefile is managed
   by the BCB IDE.

 # It is recommended to use the IDE to change any of the
   values in this

 # section.

 # --------------------------------------------------------

 VERSION = BCB.03

 # -----------------------------------------------------------

 PROJECT = Project1.exe



 OBJFILES = Project1.obj Unit1.obj

 RESFILES = Project1.res

 DEFFILE =

 RESDEPEN = $(RESFILES) Unit1.dfm

 LIBFILES = tutorial.lib

 LIBRARIES =

 SPARELIBS = VCL35.lib

 PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi
                                    bcbsmp35.bpi dclocx35.bpi \

 QRPT35.bpi TEEUI35.bpi VCLSMP35.bpi TEEDB35.bpi
                                        TEE35.bpi ibsmp35.bpi \

 NMFAST35.bpi INETDB35.bpi INET35.bpi RZDLST16.bpi
                                      RZLST16.bpi RZCMN16.bpi

 # --------------------------------------------------------------
      Spójrz na następującą linię w pliku makefile:

LIBFILES = \data\C++\TESTPROG\tutorial.lib 
      Oczywiście twoja ścieżka może być inna od mojej, ale na pewno wskaże na plik TUTORIAL.LIB, który będzie kojarzył bibliotekę DLL z wykorzystującym ją twoim programem.

Uwaga: Autorzy oraz The Bits, nie ponoszą odpowiedzialności za ewentualne szkody wynikłe z postępowania według zasad tego samouczka.
(c)1998 Peter Hamilton-Scott, Dallen Masters, & Simon Rutley-Frayne. 1999 Allan Carlton & Will Green. 
Tłumaczenie:  Maciek Durman

1  2  3  4  5  6  7