Biblioteki DLL

  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 ramach Common Tools for Visual C++ i jeżeli jest zainstalowane to można go używać w linii komend Developer Command Prompt z Menu Start

    • dodatkowo: wyeksportuj klasę o nazwie MojaKlasa zawierającą metodę publiczną Komunikat działającą identycznie jak powyższa funkcja.
  2. 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
  3. 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:
  4. Umieść w bibliotece DLL następujące zasoby: dowolny napis, dowolne menu

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:

  1. Utwórz bibliotekę DLL eksportującą funkcje zakładające i zdejmujące hak typy WH_KEYBORD
  2. 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)
  3. 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); 
  • KeyboardProc callback function
    LRESULT KeyboardProc(int code, WPARAM wParam, LPARAM lParam); 
  • CallNextHookEx - przesyła informacje do kolejnego haka w kolejce
    LRESULT CallNextHookEx(HHOOK  hhk, int    nCode, WPARAM wParam, LPARAM lParam);