Programowanie obiektowe. Ćwiczenie 12. 1
______________________________________________________________________
PROGRAMOWANIE OBIEKTOWE
ĆWICZENIE 12
•
Tworzenie biblioteki DLL
•
Aplikacja dołączająca bibliotekę statycznie
•
Aplikacja dołączająca bibliotekę dynamicznie
2
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
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"
//---------------------------------------------------------------------------
4
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;
}
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;
}
//---------------------------------------------------------------------------
6
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.dll, compinfo.lib.
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
8
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>
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;
//---------------------------------------------------------------------------
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
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
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
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
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);
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;
}
//---------------------------------------------------------------------------
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;
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());
}
//---------------------------------------------------------------------------
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).
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
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
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)
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