background image

 Programowanie obiektowe. Ćwiczenie 12.                                              1 

______________________________________________________________________ 
 

 

 

 
 
 
 
 
 
 
 
 
 

PROGRAMOWANIE OBIEKTOWE 

 

 

 

ĆWICZENIE 12 

 
 
 
 

 

 

 
 

 

Tworzenie biblioteki DLL 

 

Aplikacja dołączająca bibliotekę statycznie 

 

Aplikacja dołączająca bibliotekę dynamicznie 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

I.

 

Wstęp  

 

Zanim rozpoczniesz ćwiczenie, utwórz podkatalog COMPINFO w katalogu 

Projects oraz  utwórz szkielet projektu biblioteki DLL: 

 

 

Uruchom Buildera 

 

File







New





Other… 

 

DLL Wizard 

 

Ok 

 

Source Type: C (pozostałe opcje wyłącz) 

 

Ok 

 

File







Save All.. 

 

W katalogu COMPINFO zapisz compinfo.c 

 

Ok 

 

W katalogu COMPINFO zapisz compinfo.bpr 

 

Ok 

 

View







Project Manager 

 

Zaznacz ProjectGroup1 i kliknij prawym klawiszem myszy 

 

Save Project Group As… 

 

W katalogu COMPINFO zapisz CompInfoGroup.bpg 

 

Ok 

 

File







New





Other… 

 

Text 

 

Ok 

 

File







Save As 

 

W katalogu COMPINFO zapisz compinfo.h 

 

Ok 

 

W oknie Project Manager compinfo.dll i kliknij prawym klawiszem myszy 

 

Add… 

 

Wybierz plik compinfo.h 

 

Ok 

 

Zapamiętaj: do okna Project Manager uzyskuje się dostęp za pomocą Ctrl+Alt+F11 

 

Mamy szkielet projektu biblioteki DLL, pozostaje teraz wpisać kod źródłowy do pliku 
compinfo.c i compinfo.h. 
 
Biblioteka COMPINFO.DLL ma zadanie udostępniać następujące funkcje (napisane  
w języku C): 

Nagłówek funkcji 

Wartość zwracana przez funkcję 

double GetLibVersion() 

numer wersji biblioteki DLL 

char* user_name() 

nazwa uŜytkownika zalogowanego do 
Windows 

char* computer_name() 

nazwa komputera 

char* os_version() 

nazwa i wersja systemu operacyjnego i 
numer łatki 

 

background image

 Programowanie obiektowe. Ćwiczenie 12.                                              3 

______________________________________________________________________ 
 

 

 

II.

 

Tworzenie kodu DLL 

 

Kod w pliku compinfo.h 

 
W oknie edytora (zakładka compinfo.h) wpisujemy następujący kod: 
 
//--------------------------------------------------------------------------- 
//  compinfo.h 
// Biblioteka DLL informująca o parametrach systemu 
// C++Builder 6.0 Personal 
//--------------------------------------------------------------------------- 
#ifndef __COMPINFO_H 
#define __COMPINFO_H 
 
#if defined(__cplusplus) 
extern "C" 

#endif 
__declspec( dllexport ) double GetLibVersion(); 
__declspec( dllexport ) char* user_name(); 
__declspec( dllexport ) char* computer_name(); 
__declspec( dllexport ) char* os_version(); 
#if defined(__cplusplus) 

#endif 
 
#define WM_FRUIT_CHANGE  (WM_USER + 1001) 
#endif // __COMPINFO_H 
 

Kod w pliku compinfo.c 

 
W oknie edytora (zakładka compinfo.c) wpisujemy następujący kod: 
 
//--------------------------------------------------------------------------- 
//  compinfo.c 
// Biblioteka DLL informująca o parametrach systemu 
// C++Builder 6.0 Personal 
//--------------------------------------------------------------------------- 
 
#include <windows.h> 
#include <stdio.h> 
#include "compinfo.h" 
//--------------------------------------------------------------------------- 
 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 
int WindowsVersion(char* os, char* version, char* other) 

int NT = 0; 
OSVERSIONINFO version_info; 
 
   version_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
   GetVersionEx(&version_info); 
   if (version_info.dwMajorVersion<4) 
   { 
   sprintf(os,"Windows NT"); 
   sprintf(version,"3.x"); 
   } 
   else 
   { 
   sprintf(version,"%d.%d.%04d", version_info.dwMajorVersion, 
                                 version_info.dwMinorVersion, 
                                 version_info.dwBuildNumber); 
   } 
   switch (version_info.dwPlatformId) 
   { 
   case VER_PLATFORM_WIN32s: 
      sprintf(os,"%s", "Microsoft Win32s"); 
      break; 
   case VER_PLATFORM_WIN32_WINDOWS: 
      sprintf(os,"%s", "Microsoft Windows 95/98"); 
      break; 
   case VER_PLATFORM_WIN32_NT: 
      NT = 1; 
      switch (version_info.dwMajorVersion) 
      { 
      case 4: 
         sprintf(os,"%s", "Microsoft Windows NT"); 
         break; 
      case 5: 
         sprintf(os,"%s", "Microsoft Windows 2000"); 
         break; 
      case 6: 
         sprintf(os,"%s", "Microsoft Windows XP"); 
         break; 
      default: 
         sprintf(os,"%s", "Microsoft Windows ??"); 
      } 
      break; 
   default: 
      sprintf(os,"%s", "Microsoft Windows ??"); 
   } 
   sprintf(other,"%s", version_info.szCSDVersion); 
   return NT; 

background image

 Programowanie obiektowe. Ćwiczenie 12.                                              5 

______________________________________________________________________ 
 

 

 

 
//--------------------------------------------------------------------------- 
#pragma argsused 
 
int WINAPI DllEntryPoint( 

HINSTANCE hinstDLL,  
unsigned long fwdreason,  
void* lpvReserved) 


    switch(fwdreason) 
    { 
 

case DLL_PROCESS_ATTACH: 

            if (lpvReserved) 

MessageBox(NULL,"Biblioteka DLL dołączona do procesu 
(statycznie)",  "DLLMain",MB_OK); 

            else 

MessageBox(NULL,"Biblioteka DLL dołączona do procesu 
(dynamicznie)",  "DLLMain",MB_OK); 

            break; 
 

case DLL_THREAD_ATTACH: 

MessageBox(NULL,"Biblioteka DLL dołączona przez wątek", 
"DLLMain",MB_OK); 

            break; 
 

case DLL_THREAD_DETACH: 

            MessageBox(NULL,"Biblioteka DLL odłączona przez wątek", 

"DLLMain",MB_OK); 

            break; 
 

case DLL_PROCESS_DETACH: 

            MessageBox(NULL,"Biblioteka DLL odłączona od procesu", 

"DLLMain",MB_OK); 

            break; 
    } 
    return 1; // zawsze zwracaj wartość true; 

//--------------------------------------------------------------------------- 
 
const double version = 1.1; 
 
double GetLibVersion()  //Pobiera bieŜącą wersję biblioteki DLL. 

 

return version; 


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

background image

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

char* user_name() 

   char name[MAX_PATH]; 
   DWORD size = MAX_PATH; 
   GetUserName(name, &size); 
 

return name; 


//--------------------------------------------------------------------------- 
 
char* computer_name() 

   char name[MAX_PATH]; 
   DWORD size = MAX_PATH; 
   GetComputerName(name, &size); 
 

return name; 


//--------------------------------------------------------------------------- 
 
char* os_version() 

   boolean NT; 
   char name[MAX_PATH]; 
   char os[MAX_PATH]; 
   char version[MAX_PATH]; 
   char patch[MAX_PATH]; 
   char *blank = " "; 
   NT = WindowsVersion(os,version,patch); 
   if (NT) 
   { 
   strcpy(name, os); 
   strcat(name, blank); 
   strcat(name, version); 
   strcat(name, blank);    
   strcat(name, patch); 
   } 
   else strcpy(name, os); 
 

return name; 


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

 
 

Kompilacja biblioteki 

 

Wykonaj kompilację projektu biblioteki DLL: 
 

 

Project







Build compinfo 

 
W wyniku kompilacji powstały dwa nowe pliki: 
compinfo.dllcompinfo.lib

background image

 Programowanie obiektowe. Ćwiczenie 12.                                              7 

______________________________________________________________________ 
 

 

 

III.

 

Tworzenie aplikacji korzystającej z 

biblioteki (statycznie) 

Tworzenie kodu aplikacji AppStatic 

 

Zamknij aktualny projekt: 

 

File







Close All 

 

Utwórz podkatalog APPSTATIC w katalogu Projects oraz  utwórz szkielet projektu 
aplikacji AppStatic – zawierający pliki: 
 

 

AppStatic.bpr 

 

AppStatic.cpp 

 

AppStaticForm.h 

 

AppStaticForm.cpp 

 

AppStaticForm.dfm 

 
Skopiuj pliki: compinfo.h oraz compinfo.lib z katalogu COMPINFO do katalogu 
APPSTATIC. 
Plik compinfo.h będzie niezbędny w fazie kompilacji, aby poinformować kompilator 
jakie funkcje będą wymagane w kodzie źródłowym aplikacji, a plik  compinfo.lib 
będzie wykorzystany w fazie konsolidacji (linkowania), aby dołączyć kod biblioteki do 
generowanej aplikacji. (dodatkowo naleŜy jeszcze dopisać ją do projektu aplikacji). 

Dopisanie biblioteki COMPINFO.LIB do projektu 

 

 

W oknie Project Manager compinfo.dll i kliknij prawym klawiszem myszy 

 

Add… 

 

Wybierz plik compinfo.lib 

 

Ok 

 
Utwórz formularz (patrz Rys.1 oraz opis komponentów) 
 

 

 

Rys.1 Wygląd formularza Form1 

 

background image

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 

Opis komponentów formularza (klasy Form1) 

Przyciski: 
Name = ButtonGetVersion   

Caption= Pobierz wersję DLL 

Name = ButtonGetUser 

 

Caption= Get User Name 

Name = ButtonGetComputer  

Caption= Get Computer Name 

Name = ButtonGetVerWin   

Caption= Get OS Version 

 
Pola edycyjne: 
Name = EditVersion  

 

pole będzie wyświetlało wersję DLL 

Name = EditUser 

 

 

pole będzie wyświetlało nazwę uŜytkownika 

Name = EditComputer 

 

pole będzie wyświetlało nazwę komputera 

Name = EditVerWin  

 

pole będzie wyświetlało wersję Windows 

 
Etykiety: 
Name = Label1  

Caption= uŜytkownik 

Name = Label2  

Caption= komputer 

Name = Label3  

Caption= wersja systemu 

 

Opis metod formularza (klasy  Form1) 

 
        void __fastcall ButtonGetVersionClick(TObject *Sender) – obsługuje 
kliknięcie przycisku ButtonGetVersion 
 
        void __fastcall ButtonGetUserClick(TObject *Sender) – obsługuje kliknięcie 
przycisku ButtonGetUser 
 
        void __fastcall ButtonGetComputerClick(TObject *Sender) – obsługuje 
kliknięcie przycisku ButtonGetComputer 
 
        void __fastcall ButtonGetVerWinClick(TObject *Sender) – obsługuje 
kliknięcie przycisku ButtonGetVerWin 
 
Wpisz kod źródłowy do plików AppStaticForm.h i AppStaticForm.cpp 
 

Plik AppStaticForm.h 

 
//--------------------------------------------------------------------------- 
//  AppStaticForm.h 
//        Przykład statycznego dołączania biblioteki DLL 
//--------------------------------------------------------------------------- 
#ifndef AppStaticFormH 
#define AppStaticFormH 
//--------------------------------------------------------------------------- 
#include <Classes.hpp> 
#include <Controls.hpp> 
#include <StdCtrls.hpp> 

background image

 Programowanie obiektowe. Ćwiczenie 12.                                              9 

______________________________________________________________________ 
 

 

 

#include <Forms.hpp> 
//--------------------------------------------------------------------------- 
 
class TForm1 : public TForm 

__published:  // IDE-managed Components 
        TEdit *EditVersion; 
        TButton *ButtonGetVersion; 
        TLabel *Label1; 
        TLabel *Label2; 
        TLabel *Label3; 
        TButton *ButtonGetUser; 
        TButton *ButtonGetComputer; 
        TEdit *EditUser; 
        TEdit *EditComputer; 
        TEdit *EditVerWin; 
        TButton *ButtonGetVerWin; 
 
        void __fastcall ButtonGetVersionClick(TObject *Sender); 
        void __fastcall ButtonGetUserClick(TObject *Sender); 
        void __fastcall ButtonGetComputerClick(TObject *Sender); 
        void __fastcall ButtonGetVerWinClick(TObject *Sender); 
private: 

// User declarations 

        HINSTANCE dllhandle; 
public: 

 

// User declarations 

        __fastcall TForm1(TComponent* Owner); 
}; 
//--------------------------------------------------------------------------- 
extern PACKAGE TForm1 *Form1; 
//--------------------------------------------------------------------------- 
#endif 
 
 
 

 

Plik AppStaticForm.cpp 

 
#include <vcl.h> 
#pragma hdrstop 
 
#include "AppStaticForm.h" 
#include "compinfo.h" 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
 
TForm1 *Form1; 
//--------------------------------------------------------------------------- 

background image

10 

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 
__fastcall TForm1::TForm1(TComponent* Owner) 
        : TForm(Owner) 

        dllhandle = 0; 

//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::ButtonGetVersionClick(TObject *Sender) 

  EditVersion->Text = AnsiString(GetLibVersion()); 

//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::ButtonGetUserClick(TObject *Sender) 

     EditUser->Text = AnsiString(user_name()); 

//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::ButtonGetComputerClick(TObject *Sender) 

     EditComputer->Text = AnsiString(computer_name()); 

//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::ButtonGetVerWinClick(TObject *Sender) 

     EditVerWin->Text = AnsiString(os_version()); 

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

 
 

Kompilacja aplikacji 

 

Wykonaj kompilację projektu aplikacji: 
 

 

Project







Build AppStatic 

 
W wyniku kompilacji powstał nowy pliki: 
AppStatic.exe

Uruchomienie aplikacji 

 
Aby aplikacja poprawnie pracowała, pliki AppStatic.exe
oraz compinfo.lib muszą znajdować w tym samym katalogu. 

 

 

Run







Run 

 

background image

 Programowanie obiektowe. Ćwiczenie 12.                                              11 

______________________________________________________________________ 
 

 

 

 
 
Dołączaniem bibliotek zajmuje się wewnętrzna funkcja DLLMain
 
Po uruchomieniu aplikacji na ekranie pojawi się komunikat informujący o dołączeniu 
biblioteki i sposobie dołączenia: 
 

 

 

Rys.2 Statyczne dołączenie biblioteki 

 
Następnie pojawia się okno główne aplikacji AppStatic
Przyciski powodują wywoływanie odpowiednich funkcji z biblioteki COMPIFO.LIB
 

 

 

Rys.3 Wygląd pracującej aplikacji APPSTATIC 

 
Po zakończeniu aplikacji (a dokładnie po zamknięciu okna) następuje odłączenie 
biblioteki co objawia się odpowiednim komunikatem. 
 

 

 

Rys.4 Odłączenie biblioteki 

 
 
 

background image

12 

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 

IV.

 

Tworzenie aplikacji korzystającej z 

biblioteki (dynamicznie) 

 

Tworzenie kodu aplikacji AppDynamic 

 

Zamknij aktualny projekt: 

 

File







Close All 

 

Utwórz podkatalog APPDYNAMIC w katalogu Projects oraz  utwórz szkielet projektu 
aplikacji AppDynamic – zawierający pliki: 
 

 

AppDynamic.bpr 

 

AppDynamic.cpp 

 

AppDynamicForm.h 

 

AppDynamicForm.cpp 

 

AppDynamicForm.dfm 

 
UWAGA: w oknie Project Manager NIE NALEśY dopisywać Ŝadnego dodatkowego 
pliku. W tym przykładzie do ładowania biblioteki uŜyjemy funkcji LoadLibrary.  
Funkcja ta będzie szukała pliku  compinfo.dll w katalogu 
C:\WINDOWS\SYSTEM32, a jeśli nie znajdzie to w katalogu aktualnym. 
 

Kopiowanie biblioteki COMPINFO.DLL do środowiska Windows 

 

Skopiuj plik do compinfo.dll do katalogu C:\WINDOWS\SYSTEM32 

 

Usuń plik compinfo.dll z katalogu APPDYNAMIC 

 
Utwórz formularz (patrz Rys.5 oraz opis komponentów) 
 

Opis komponentów formularza (klasy Form1) 

Przyciski: 
Name = ButtonLoadLibrary 

Caption= Wczytaj compinfo.DLL 

Name = ButtonProcAddress 

Caption= Pobierz adres funkcji DLL 

Name = ButtonUnloadLibrary 

Caption= Zwolnij compinfo.DLL 

Name = ButtonGetVersion   

Caption= Pobierz wersję DLL 

Name = ButtonGetUser 

 

Caption= nazwa uŜytkownika 

Name = ButtonGetComputer  

Caption= nazwa komputera 

Name = ButtonGetVerWin   

Caption= wersja Windows 

Właściwość Enable przycisków ustaw na false. Dla przycisku ButtonLoadLibrary na 
true 
 
Etykiety: 
Name = Label1  

 

 

Caption= Uchwyt DLL 

 

background image

 Programowanie obiektowe. Ćwiczenie 12.                                              13 

______________________________________________________________________ 
 

 

 

 
Pola edycyjne: 
Name = EditDLLHandle    

pole będzie wyświetlało nr uchwytu do DLL 

Name = EditVersion  

 

pole będzie wyświetlało wersję DLL 

Name = EditUser 

 

 

pole będzie wyświetlało nazwę uŜytkownika 

Name = EditComputer 

 

pole będzie wyświetlało nazwę komputera 

Name = EditVerWin  

 

pole będzie wyświetlało wersję Windows 

 
 

 

 

Rys.5 Wygląd formularza Form1 

 

Opis metod formularza (klasy  Form1) 

 
void __fastcall ButtonLoadLibraryClick(TObject *Sender) – obsługuje kliknięcie 
przycisku ButtonLoadLibrary 
 
void __fastcall ButtonUnloadLibraryClick(TObject *Sender) – obsługuje kliknięcie 
przycisku ButtonUnloadLibrary 
 
void __fastcall ButtonGetVersionClick(TObject *Sender) – obsługuje kliknięcie 
przycisku ButtonGetVersion 
 
void __fastcall ButtonProcAddressClick(TObject *Sender)– obsługuje kliknięcie 
przycisku ButtonProcAddress 
 
void __fastcall ButtonGetUserClick(TObject *Sender) – obsługuje kliknięcie 
przycisku ButtonGetUser 
 

background image

14 

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

void __fastcall ButtonGetComputerClick(TObject *Sender) – obsługuje kliknięcie 
przycisku ButtonGetComputer 
 
void __fastcall ButtonGetVerWinClick(TObject *Sender) – obsługuje kliknięcie 
przycisku ButtonGetVerWin 
 
 
Wpisz kod źródłowy do plików AppDynamicForm.h i AppDynamicForm.cpp 
 

Plik AppDynamicForm.h 

 
//--------------------------------------------------------------------------- 
//  AppStaticForm.h 
// 
//        Przykład dynamicznego dołączania biblioteki DLL 
//--------------------------------------------------------------------------- 
#ifndef AppDynamicFormH 
#define AppDynamicFormH 
//--------------------------------------------------------------------------- 
#include <Classes.hpp> 
#include <Controls.hpp> 
#include <StdCtrls.hpp> 
#include <Forms.hpp> 
//--------------------------------------------------------------------------- 
 
class TForm1 : public TForm 

__published: 

// IDE-managed Components 

        TButton *ButtonLoadLibrary; 
        TEdit *EditVersion; 
        TButton *ButtonUnloadLibrary; 
        TButton *ButtonGetVersion; 
        TButton *ButtonProcAddress; 
        TLabel *Label1; 
        TEdit *EditDLLHandle; 
        TButton *ButtonGetUser; 
        TButton *ButtonGetComputer; 
        TEdit *EditUser; 
        TEdit *EditComputer; 
        TEdit *EditVerWin; 
        TButton *ButtonGetVerWin; 
        void __fastcall ButtonLoadLibraryClick(TObject *Sender); 
        void __fastcall ButtonUnloadLibraryClick(TObject *Sender); 
        void __fastcall ButtonGetVersionClick(TObject *Sender); 
        void __fastcall ButtonProcAddressClick(TObject *Sender); 
        void __fastcall ButtonGetUserClick(TObject *Sender); 
        void __fastcall ButtonGetComputerClick(TObject *Sender); 
        void __fastcall ButtonGetVerWinClick(TObject *Sender); 
 

background image

 Programowanie obiektowe. Ćwiczenie 12.                                              15 

______________________________________________________________________ 
 

 

 

private: 

// User declarations 

        HINSTANCE dllhandle; 
        typedef double (*GETLIBVERSION)(); 
        GETLIBVERSION GetLibVersion; 
 
        typedef char* (*USER_NAME)(); 
        USER_NAME user_name; 
 
        typedef char* (*COMPUTER_NAME)(); 
        COMPUTER_NAME  computer_name; 
 
        typedef char* (*OS_VERSION)(); 
        OS_VERSION os_version; 
 
public: // User declarations 
        __fastcall TForm1(TComponent* Owner); 
}; 
//--------------------------------------------------------------------------- 
extern PACKAGE TForm1 *Form1; 
//--------------------------------------------------------------------------- 
#endif 
 
 
 

Plik AppDynamicForm.cpp 

 
//--------------------------------------------------------------------------- 
//  AppDynamicForm.cpp 
// 
//  Przykład dynamicznego dołączania biblioteki DLL 
//--------------------------------------------------------------------------- 
#include <vcl.h> 
#pragma hdrstop 
 
#include "AppDynamicForm.h" 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
 
TForm1 *Form1; 
//--------------------------------------------------------------------------- 
 
__fastcall TForm1::TForm1(TComponent* Owner) 
        : TForm(Owner) 

        dllhandle = 0; 

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

background image

16 

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 
 
void __fastcall TForm1::ButtonLoadLibraryClick(TObject *Sender) 

    dllhandle = LoadLibrary("compinfo.dll"); // zachowaj uchwyt 
    EditDLLHandle->Text = AnsiString((int)dllhandle); 
    if (dllhandle) 
    { 
        ButtonUnloadLibrary->Enabled = true; 
        ButtonProcAddress->Enabled = true; 
 
    } 
    else 
    { 
        ShowMessage("Błąd podczas dołączania biblioteki DLL"); 
    } 

 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::ButtonUnloadLibraryClick(TObject *Sender) 

    if (dllhandle) 
    { 
        FreeLibrary(dllhandle); 
        ButtonUnloadLibrary->Enabled = false; 
        ButtonProcAddress->Enabled = false; 
        ButtonGetVersion->Enabled = false; 
        ButtonGetUser->Enabled = false; 
        EditUser->Text = ""; 
        ButtonGetComputer->Enabled = false; 
        EditComputer->Text = ""; 
        ButtonGetVerWin->Enabled = false; 
        EditVerWin->Enabled = false; 
        EditVerWin->Text = ""; 
        EditDLLHandle->Text = ""; 
    } 

 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::ButtonProcAddressClick(TObject *Sender) 

  if (dllhandle) 
  { 
    GetLibVersion  = 
        (GETLIBVERSION)GetProcAddress(dllhandle, "_GetLibVersion"); 
    if (GetLibVersion)  ButtonGetVersion->Enabled = true; 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 12.                                              17 

______________________________________________________________________ 
 

 

 

    user_name  = 
        (USER_NAME)GetProcAddress(dllhandle, "_user_name"); 
    if (user_name)  ButtonGetUser->Enabled = true; 
 
    computer_name  = 
        (COMPUTER_NAME)GetProcAddress(dllhandle, "_computer_name"); 
    if (computer_name)  ButtonGetComputer->Enabled = true; 
 
    os_version  = 
        (OS_VERSION)GetProcAddress(dllhandle, "_os_version"); 
    if (os_version)  ButtonGetVerWin->Enabled = true; 
 
  } 

//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::ButtonGetVersionClick(TObject *Sender) 

 
  if (dllhandle) 
  { 
    EditVersion->Text = AnsiString(GetLibVersion()); 
  } 

//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::ButtonGetUserClick(TObject *Sender) 

     EditUser->Text = AnsiString(user_name()); 

//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::ButtonGetComputerClick(TObject *Sender) 

     EditComputer->Text = AnsiString(computer_name()); 

//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::ButtonGetVerWinClick(TObject *Sender) 

     EditVerWin->Text = AnsiString(os_version()); 

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

background image

18 

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 

Kompilacja aplikacji 

 

Wykonaj kompilację projektu aplikacji: 
 

 

Project







Build AppDynamic 

 
W wyniku kompilacji powstał nowy pliki: 
AppDynamic.exe

Uruchomienie aplikacji 

 
Aby aplikacja poprawnie pracowała, plik compinfo.dll musi znajdować katalogu 
C:\WINDOWS\SYSTEM32, albo w tym samym co aplikacja. 

 

 

Run







Run 

 
Dołączaniem bibliotek zajmuje się wewnętrzna funkcja DLLMain
 
Po uruchomieniu aplikacji na ekranie pojawi się okno główne aplikacji AppDynamic
 

 

 

Rys.6 Wygląd okna aplikacji APPDYNAMIC po uruchomieniu 

 
Po kliknięciu przycisku Wczytaj compinfo.dll , nastąpi dołączenie dynamiczne 
biblioteki oraz uaktywnienie przycisków słuŜących do pobrania adresów funkcji, 
zwalniania biblioteki DLL (rys. 6). 
 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 12.                                              19 

______________________________________________________________________ 
 

 

 

 
 
Wyświetli się komunikat informujący o dołączeniu biblioteki i sposobie jej dołączenia 
(rys. 7). 

 

Rys.7 Dynamiczne dołączenie biblioteki 

 

 

Rys.8 Wygląd pracującej aplikacji APPDYNAMIC 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

20 

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 

 

 

Rys.9 Wygląd pracującej aplikacji APPDYNAMIC 

 
Następnie klikamy przycisk Pobierz adres funkcji DLL oraz przycisk Pobierz wersję 
DLL
 – uaktywniają się pozostałe przyciski (rys. 9). 
 
Pobieramy dane o systemie za pomocą odpowiednich przycisków. 
 

 

Rys.10 Wygląd pracującej aplikacji APPDYNAMIC 

 
 
 

background image

 Programowanie obiektowe. Ćwiczenie 12.                                              21 

______________________________________________________________________ 
 

 

 

 
 
Po zakończeniu aplikacji (a dokładnie po zamknięciu okna) następuje odłączenie 
biblioteki co objawia się odpowiednim komunikatem (rys. 11). 
 

 

Rys.11 Odłączenie biblioteki 

Biblioteka WinAPI 

 
Następujące funkcje zostały napisane w oparciu o wewnętrzną bibliotekę WinAPI. Jej 
opis znajduje się w pliku Pomocy On Line (Start







Wszystkie programy





Borland 

C++ Builder







Help





MS SDK Help Files





Win 32 SDK Reference): 

 
int WindowsVersion(char* os, char* version, char* other) 
GetUserName(name, &size) 
GetComputerName(name, &size)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

22 

 Programowanie obiektowe. Ćwiczenie 12. 

______________________________________________________________________ 

______________________________________________________________________ 

 

 

 

 

SPIS TREŚCI 

 

 

I. 

Wstęp ........................................................................................................................ 2 

II.  Tworzenie kodu DLL................................................................................................ 3 

Kod w pliku compinfo.h ........................................................................................... 3 
Kod w pliku compinfo.c ........................................................................................... 3 
Kompilacja biblioteki ............................................................................................... 6 

III. 

Tworzenie aplikacji korzystającej z biblioteki (statycznie).................................. 7 

Tworzenie kodu aplikacji AppStatic......................................................................... 7 
Dopisanie biblioteki COMPINFO.LIB do projektu ................................................. 7 
Opis komponentów formularza (klasy Form1)......................................................... 8 
Opis metod formularza (klasy  Form1)..................................................................... 8 
Plik AppStaticForm.h ............................................................................................... 8 
Plik AppStaticForm.cpp............................................................................................ 9 
Kompilacja aplikacji ............................................................................................... 10 
Uruchomienie aplikacji........................................................................................... 10 

IV. 

Tworzenie aplikacji korzystającej z biblioteki (dynamicznie) ........................... 12 

Tworzenie kodu aplikacji AppDynamic ................................................................. 12 
Kopiowanie biblioteki COMPINFO.DLL do środowiska Windows...................... 12 
Opis komponentów formularza (klasy Form1)....................................................... 12 
Opis metod formularza (klasy  Form1)................................................................... 13 
Plik AppDynamicForm.h........................................................................................ 14 
Plik AppDynamicForm.cpp .................................................................................... 15 
Kompilacja aplikacji ............................................................................................... 18 
Uruchomienie aplikacji........................................................................................... 18 

Biblioteka WinAPI ......................................................................................................... 21