Biblioteki DLL
Zadanie 1
- Utwórz bibliotekę DLL eksportującą przynajmniej jedną funkcję i jedną zmienną:
- utwórz pusty projekt biblioteki DLL w Visual Studio
- wyeksportuj z utworzonej biblioteki funkcję o nazwie
Komunikat
, która wyświetla okno MessageBox z zadanym w argumencie komunikatem,
void Komunikat(TCHAR *tekst);
- wyeksportuj z biblioteki zmienną całkowitą o wartości początkowej 42
- do eksportowania wykorzystaj modyfikator:
__declspec(dllexport)
Kompilator C++ „magluje” nazwy funkcji. Aby temu zapobiec można zadeklarować funkcje oraz zmienne eskortowane z biblioteki za pomocą
exterm "C" {...}
- korzystając z narzędzia DumpBin.exe zobacz listę eksportowanych (oraz importowanych) funkcji oraz zmiennych z utworzonego pliku
.dll
oraz.lib
.
DumpBin.exe /EXPORTS plik.dll DumpBin.exe /IMPORTS plik.dll
Narzędzie
DumpBin
dostarczane jest w ramachCommon Tools for Visual C++
i jeżeli jest zainstalowane to można go używać w linii komendDeveloper Command Prompt
z Menu Start - dodatkowo: wyeksportuj klasę o nazwie
MojaKlasa
zawierającą metodę publicznąKomunikat
działającą identycznie jak powyższa funkcja.
- Utwórz w ramach tego samego rozwiązania nowy projekt i zlinkuj bibliotekę statycznie (niejawnie). Przetestuj działanie dostępnych w bibliotece funkcji, zmiennych i klas.
- dodaj do projektu odpowiednio przygotowany plik nagłówkowy biblioteki i wskaż linkierowi lokalizację plików lib i dll.
- do importowania funkcji i zmiennych z biblioteki wykorzystaj modyfikator:
__declspec(dllimport)
. Spróbuj tak przygotować plik nagłówkowy aby mógł być współdzielony zarówno przy budowaniu biblioteki DLL jak i przy budowaniu projektu aplikacji wykorzystującej tą bibliotekę.
- korzystając z DumpBin.exe zobacz listę eksportowanych (oraz importowanych) funkcji i zmiennych z utworzonego pliku
.exe
- dodaj do biblioteki DLL funkcję DllMain. Wyświetl komunikaty (MessageBox) informujące o tym jaki był powód uruchomienia tej funkcji (np.
DLL_PROCESS_ATTACH
) - utwórz dodatkowy wątek tak aby wywołać w bibliotece DLL funkcję DllMain z
DLL_THREAD_ATTACH
- Utwórz w ramach tego samego rozwiązania nowy projekt i zlinkuj bibliotekę dynamicznie (jawnie) w czasie działania programu. Przetestuj działanie dostępnych w bibliotece funkcji, zmiennych i klas.
- korzystając z DumpBin.exe zobacz listę eksportowanych (oraz importowanych) funkcji z utworzonego pliku
.exe
- wyświetl pełną ścieżkę i nazwę wczytanej biblioteki,
- przydatne funkcje:
- LoadLibrary wczytuje moduł do pamięci wirtualnej procesu
- GetProcAddress uzyskuje adres importowanej funkcji
- FreeLibrary zwalnia zasoby biblioteki DLL
- Umieść w bibliotece DLL następujące zasoby: dowolny napis, dowolne menu
- wczytaj z biblioteki zapisane zasoby. Wczytany tekst wyświetl a menu załaduj jako menu kontekstowe (aktywowane prawym klawiszem myszy w oknie)
- przydatne funkcje:
Zadanie 2
Utwórz program zakładający hak przechwytujący globalnie próbę zamknięcia dowolnego okna za pomocą skrótu klawiszowego Alt+F4
. W tym celu wykonaj następujące kroki:
- Utwórz bibliotekę DLL eksportującą funkcje zakładające i zdejmujące hak typy WH_KEYBORD
- Zaimplementuj procedurę haka KeyboardProc wychwytującą wciśnięcie klawisza F4 (VK_F4) i jednoczesne wciśnięcie lewego klawisza Alt (29 bit argumentu
lParam
) - Utwórz program, który ładuje dynamicznie bibliotekę DLL i uruchamia funcję zakładającą hak globalny. Zadbaj o to, aby przy zamykaniu aplikacji hak został zdjęty.
Przydatne funkcje:
- SetWindowsHookEx - instaluje hak
HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId);
- UnhookWindowsHookEx - usuwa hak
BOOLUnhookWindowsHookEx(HHOOK hhk);
- CallNextHookEx - przesyła informacje do kolejnego haka w kolejce
LRESULT CallNextHookEx(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam);