Jacek Matulewski
Programowanie aplikacji dla systemu Windows w C++

Plan wykładu:
  1. Czym jest Windows Application Programmer Interface (WinAPI)?
  2. Komunikaty Windows (dema: WinMain, Komunikaty, FormatMessage)
  3. Graficzny interfejsu użytkownika (GUI) z poziomu WinAPI (dema: Przyciski, Kolory, ListaOkien)
  4. Procesy i wątki (dema: CreateProcess, WinExec_ShellExecute.zip)
  5. Biblioteki DLL, aplety panelu sterowania, haki (dema)
  6. Funkcje jądra i powłoki służące do obsługi lokalnych plików, katalogów i dysków (dema, 7MB)
  7. Rejestr systemu Windows (dema)
  8. Usługi systemu Windows
  9. Elementy programowania sieciowego (Windows Sockets 2)
  10. Technologie COM, COM+, DCOM, automatyzacja
  11. WinAPI i platforma .NET (dema)
    1. Technologia P/Invoke
    2. Odbieranie i wysyłanie komunikatów Windows
    3. Integracja kodu zarządzanego i niezarządzanego
Skompilowane projekty demonstracyjne (pliki .exe)


Literatura:

  1. Jeffrey Richter, Christopher Nasarre Windows via C/C++ (wydanie 5), Microsoft Press, Warszawa 2009
  2. Johnson M. Hart Programowanie w systemie Windows (wydanie 4), Helion 2010
  3. Jacek Matulewski, Maciej Pakulski, Dawid Borycki, Bartosz Biały, Piotr Pepłowski, Michał Matuszak, Daniel Szlag, Dawid Urbański Visual C++. Gotowe rozwiązania dla programistów Windows, Helion 2010
  4. Jacek Matulewski C++Builder 2006. 222 gotowe rozwiązania, Helion 2006 (rozdziały 5-10)
  5. John Paul Mueller COM+. Kompendium programisty, Helion 2002
Linki:
  1. EFNet #Winprog 2007 - strona dla początkujących, Tutorial, FAQ
  2. MSDN Windows Development
  3. PInvoke.net - dla programistów .NET


Plan laboratorium:

  1. Aplikacje "dialog based" MFC w Visual C++ (Win32)
  2. Uzupełnienie/powtórzenie wiadomości o C++: wskaźniki, referencje, szablony, klasy, wyjątki (w razie potrzeby) - klasa liczby zespolonej
  3. Aplikacja konsolowa korzystająca z funkcji Win32 (wyświetlanie podstawowych informacji o systemie)
  4. Pętla główna aplikacji, tworzenie okna i obsługa kolejki komunikatów
  5. Tworzenie przycisku i innych kontrolek (odtworzenie aplikacji "Kolory" w czystym WinAPI)
  6. Okna i zarządzanie nimi (lista okien z pobieraniem informacji i modyfikacją ich własności)
  7. Aplikacja uruchamiająca domyślny edytor pliku (ShellExecute)
  8. Analiza klasy uruchamiającej i kontrolującej procesy
  9. Prosta biblioteka DLL i jej wykorzystanie w aplikacji
  10. Analiza kodu apletu panelu sterowania
  11. Przechwytywanie naciskanych klawiszy za pomocą haku
  12. Aplikacja MFC wyświetlająca informacje o dyskach logicznych (typ systemu plików, ilość wolnego miejsca, itp.) - aplikacja i aplet panelu sterowania
  13. Kopiowanie pliku ze śledzeniem postępu (CopyFileEx)
  14. Odtwarzanie multimediów z użyciem Media Control Interface (MCI) - analiza klasy opakowującej MCI
  15. Aplikacja klient-serwer: zdalny podgląd okna (+ usługi i zdalna kontrola)

  16. Wprowadzenie do błyskawicznego projektowania aplikacji (RAD) w Borland C++Builder [pdf]
    • Podstawy programowania RAD (aplikacja "Kolory"). Idea programowania zdarzeniowego
    • Przykład (Notatnik)
    • Grafika na płótnie okna (Canvas)
    • Multimedia
    • Klasy i komponenty


Materiały i kody źródłowe z laboratoriów:

Kody źródłowe z semestru zimowego 2018/2019

Opis projektu     Microsoft Visual C++ 2010     Borland C++Builder 6     Borland Delphi 7
(dla PSPiZK)
Wstęp do programowania wizualnego/RAD Suwak (MFC)
Nie działa komunikat ..ThumbPos..

Suwak (MFC, WM_HSCROLL)
Kolory (VCL) Kolory (VCL)
Aplikacja wyświetlająca opisy błędów Windows Opisy błędów Opisy błędów -
Definicja typu liczby zespolonej (szablon klasy)
i przykład jej użycia do obliczania zbioru
Mandelbrota i Julii
- Mandelbrot Mandelbrot
Projektowanie kontrolek - Przykład kontrolki VCL
(TMailLabel, TWWWLinkLabel)
-
Odbieranie i wysyłanie komunikatów Komunikaty (MFC) Komunikaty (VCL) Komunikaty (VCL)
Aplikacja konsolowa korzystająca
z funkcji WinAPI
Wyświetlanie wersji Windows - -
Tworzenie okna i pętla główna WinMain WinMain
Jak stworzyć pusty projekt
Win32 w BCB6
-
Kolory w czystym WinAPI
(kontynuacja WinMain)
Kolory - -
Lista okien z podglądem (EnumWindows) Lista okien
Rozwiniąć na wzór projektu BCB6
Lista okien
(na bazie projektów Sławomira
Wawrzyniaka i Michała Gajewskiego)
-
Aplikacja uruchamiająca procesy
(funkcja WinExec i ShellExecute)
WinExec i ShellExecute
(i okno dialogowe wyboru pliku)
- -
Uruchamianie i kontrola procesów Klasa CCreateProcess Komponenty TCreateProcess i TControlProcess -
Biblioteka DLL - Biblioteki DLL
(wersja bez VCL)
-
Hak (KeyLogger) Niżej jest wersja VC++ studenta Haki - przechwytywanie komunikatów -
DiskFree (biblioteka DLL,
aplikacja MFC i aplikacja konsolowa)
- - -
Aplet sterowania - DiskFree - Aplety panelu sterowania
To nie jest DiskFree
-
Rejestr systemu Windows Rejestr (czyste WinAPI)
(por. MFC CWinApp::SetRegistryKey)
W C++Builderze wygodniej korzystać z TRegistry W Delphi wygodniej korzystać z TRegistry
MCI - Odtwarzacz audio/wideo bazujący na MCI
(rozszerzenie projektu Mateusza Sołtysa)
-
Cztery proste funkcje związane z siecią Internet (wersja Unicode)
Internet (wersja ANSI)
Internet -
Windows Sockets WinSock
(projekty MP z książki o VC++,
zrobić ostatni projekt własny,
(?)rozszerzyć o podgląd okna
)
- -
Dodatek świąteczny: - Choinka - okno o dowolnym ksztalcie,
powiadomienie (dymek), odtwarzanie
pliku pobranego z sieci, automatyczne
uruchamianie i zapisywanie pozycji
w rejestrze
-


 
Pakiety kodów źródłowych z książek

Pliki wykonywalne (.exe) projektów (skompilowane tak, żeby można je było uruchomić bez bibliotek Borlanda)

Zob. też materiały kursu V w wersji C++Builder i Visual C++
oraz projektowanie aplikacji Windows z wykorzystaniem narzędzi RAD (C++ Builder/Delphi/VB).


Referaty:

Warunki zaliczenia referatu:
- przygotowanie prezentacji PowerPoint/PDF (w miarę szczegółowej)
- wygłoszenie referatu na zajęciach (35-45 min)
- przygotowanie 2 pytań do referatu

Plan referatów [txt]
Możliwe pytania z referatów na kolokwium [txt]

Prowadzący     Referat (PDF/PPT)     Dodatkowe materiały     Data     Linki
Sławomir Wawrzyniak PowerShell Skrypty 5.11.2010 Pobierz PowerShell 2.0
Strona Microsoft (ang.)
Przewodnik po PowerShell (do druku, pl)
Michał Gajewski Memory-mapped files i zarządzanie pamięcią Projekty 12.11.2010 MSDN
Wikipedia
Michał Szyszka Windows Sockets 2 Projekty (na bazie VCL)
Uzupełnić o przesyłanie plików
Przebieg inicjacji połączenia kontrolki TServerSocket
Przebieg inicjacji połączenia kontrolki TClientSocket
Uzupełnienie (JM)
19.11.2010 MSDN
Wikipedia
The Indy Project
Mateusz Sołtys Media Control Interface (MCI) Projekt odtwarzacza (bez TMediaPlayer z VCL)
Uzupełnienie o powiadamianie o zakonczeniu odtwarzania (JM)
Zob. też projekt zaliczeniowy poniżej.
26.11.2010 MSDN
Tomasz Jurkiewicz Systemy plików w WinAPI Projekt
3.12.2010 MSDN
Jakub Szatkowski Wątki i ich synchronizacja Projekty
Aplikacja ilustrująca zagadnienie pięciu ucztujących filozofów
Aby doprowadzić do blokady należy kazać jeść przez chwilę dwóm nie sąsiadującym filozofom, a następnie kliknąć przycisk "Wszyscy na raz".
3.12.2010 MSDN
Wikipedia
Janusz Ganczarski - Programowanie wielowątkowe w Win32
Problem ucztujacych filozofow (Wikipedia)
Paweł Wróblewski Programowanie usług systemu Windows Projekty
10.12.2010 MSDN
MSDN
Krzysztof Sumowski
Rafał Zarębski
Piotr Warzocha
Bezpieczeństwo aplikacji Windows Projekty
Opis
7.1.2011
Dawid Zarzycki Reverse Engineering Projekty
Opis
Film (realizacja zad. 1 z prezentacji)
14.1.2011 Linki [txt]
Piotr Małłek Komunikacja między procesami (pipes) Projekty 14.1.2011 MSDN



Alicja Zwiewka Funkcje WinAPI związane z obsługą myszy Projekty
Źle działa zmiana kursora myszy
28.10.2011
Jakub Wiśniewski Usługi systemu Windows Projekty
Brak materiałów!
9.11.2011,
16.11.2011
Krzysztof Jeliński Tworzenie gadgetów dla Windows Vista/7 Projekty
Gadget
Gadget po uruchomieniu w Windows Vista jest zbyt mały
16.11.2011
23.11.2011
Natalia Wyczislok Wątki i ich synchronizacja Projekty 25.11.2011
30.11.2011
Łukasz Rączkowski Direct Sound Projekty (VS2010 i BCB6)
Wymagany format plików WAVE: dwukanałowy PCM, częstotliwość próbkowania 44100 kHz (CDA)
30.11.2011
7.12.2011
DirectSound w C++Builder
Uwaga! Projekt BCB6 (JM) nie działa lub działa tylko czasami (popr. zob. link); obsługę rozszerzyć do innych formatów niż CDA w WAVE
Justyna Lipska Szyfrowanie: CryptoAPI, CAPICOM i alternatywy Projekty aplikacji konsolowych (VS2010)
Projekty aplikacji MFC (VS2010)
9.12.2011
14.12.2011
Uwaga! Program w wersji MFC wymaga wskazania pustego pliku do zapisu.
Przemysław Buczkowski Podstawy COM Projekty (VS2010, ATL)
Opis krok po kroku
14.12.2011
16.12.2011
Łukasz Matczyński Rozpoznawanie mowy za pomocą Microsoft Speech Recognition Projekty (VS2010)
Uwaga! Nie zadziała w polskiej wersji językowej Windows
4.01.2012
Damian Turula Microsoft Speech API (SAPI) Projekty (VS2010) 4.01.2012 MSDN
Tomasz Dzieniak Podstawy UI w WinAPI:
Tworzenie okna
Tworzenie kontrolki (przycisku)
"Anatomia" okna
GDI
Projekty (VS2010):
Tworzenie okna
Tworzenie przycisku
Ładowanie i wyświetlanie obrazu BMP. Chowanie paska zadań.
GDI - pobieranie koloru z punktu ekranu wskazanego myszką Zmiana kursora myszy - poprawić w kodzie AZ wyżej
Haki (keylogger). Wersja BCB6 jest wyżej.
18.01.2012
20.01.2012
25.01.2012
Zadania
Uwaga! Przycisk można utworzyć na oknie (zob. projekt)
Michał Gajewski Programowanie dla Windows 8 (Metro)
Projekty (VS 11) 11.02.2012 (nie referowane)



Piotr Ablewski Obsługa wielodotyku i gestów (Touch API) w Windows 7 i 8
Projekty (VS 2012)
Informacje
Brak prezentacji i materiałów!!!
6.11.2012
13.11.2012
MSDN
Jakub Kucharski Wstęp do DirectX
Przykładowe projekty są w DirectX SDK 4.12.2012 Developing Games for Windows (MSDN)
Krzysztof Chyziński Tworzenie i ładowanie bibliotek DLL
Przykłady (C++)
18.12.2012
Stipe Kodžoman Windows Desktop Sharing
Projekt (dla platformy .NET!)
8.1.2013 MSDN



Marcin Burak, Adam Błaszczyk Komunikacja procesów uruchamianych na różnych komputerach (aplikacje rozproszone)
Projekt
30.11.2018 Protokoły HTTP i WinSockets - projekty .NET WPF i .NET Core 2.1 z funkcjami WinAPI
Protokół RPC - projekt C++
Igor Pawlikowski Strukturalna obsługa wyjątków (SEH)
Projekt
7.12.2018 Konstrukcje __try..__except i __try..__finally oraz funkcja RaiseException
Piotr Kruszewski Kryptografia. Szyfrowanie plików
Projekt
7.12.2018
14.12.2018
Kacper Lamparski Wątki
Projekt
14.12.2018
21.12.2018
Kajetan Krzewina Usługi
Projekt
21.12.2018 sc.exe create "Nazwa usługi" binPath= "D:\Usługa.exe" (spacja po Path)
sc.exe start "Nazwa usługi"
sc.exe stop "Nazwa usługi"
sc.exe delete "Nazwa usługi"
Nieprzetestowane
Michał Kossakowski WaitableTimer
Projekt
4.01.2019
11.01.2019
Możliwość wybudzenia komputera
Przemysław Kuligowski Pliki mapowane
Projekt
11.01.2019 Można też w .NET. - https://docs.microsoft.com/pl-pl/dotnet/standard/io/memory-mapped-files
Scenariusz: Pliki mapowane tworzone w jednej aplikacji, a pozostałe dostęp poprzez widoki.
Brakuje przykładu równoczesnego dostępu do mapowanego pliku (obrazu)
Bartosz Pawlak Sterta procesu
Projekt
25.01.2019 https://docs.microsoft.com/en-us/windows/desktop/api/heapapi/
Magdalena Linowiecka Pula wątków
Projekt
25.01.2019 Wzór kodu z projektu: MSDN
Dominika Jaśniewska Scenariusz plug-inów - dynamicznie ładowane biblioteki DLL z funkcjami o znanej sygnaturze
Projekt
25.01.2019
Tomasz Kobus Speach API
Projekt
4.02.2019 (przesłane)
Patrycja Brzozowska IOCP
Projekt
25.02.2019 (przesłane)


Projekty zaliczeniowe:

Projekty należy wybrać najpóźniej do 17 grudnia. Można zgłaszać się mailem lub na zajęciach (o pierwszeństwie decyduje kolejność zgłoszenia). Do projektu mogą zgłaszać się zespoły 2 lub 3 osobowe, ale projekt musi być odpowiednio bogatszy.
Termin prezentacji: styczeń.
We wszystkich aplikacjach powinny być wyraźnie rozdzielone warstwy modelu (w osobnej bibliotece DLL, przy okazji API aplikacji) i widoku (MFC, VCL lub konsola).
Proszę przygotować projekty w Borland C++Builder 6 (preferowany) lub Visual C++ (wersja 2008 lub 2010). Projekty muszą kompilować się w czystym środowisku BCB6 (ew. VC++) tzn. bez dodatkowych bibliotek (poza szczególnymi uzgodnionymi przypadkami) bez ostrzeżeń i błędów.

Rezerwacje projektów zaliczeniowych [txt]

Autor     Projekt (kod źródłowy)     Semestr     Uwagi
Michał Szyszka Aplikacja klient-serwer umożliwiająca podgląd zdalnego ekranu
(klient za pomoca winsock wysyła zrzuty ekranu, serwer wyświetla rysunki wysłane przez wszystkich klientów)
lato 2010/2011 Część kodu musi być skompilowana w Dev-C
Mateusz Sołtys Odtwarzacz MCI lato 2010/2011 W trakcie przeciągania (drag&drop) pliku ze spacja w nazwie do okna z listą nie udaje się obliczyć długości trwania utworu.
Tomasz Jurkiewicz Przeglądanie zawartości dysków lato 2010/2011 Nie uruchamia się w środowisku BCB6. Trzeba skompilować projekt i uruchomić .exe.
Paweł Wróblewski Aplikacja klient-serwer umożliwiająca zdalne wykonywanie poleceń konsoli (klient wysyła łańcuch-polecenie, który jest wykonywany przez serwer (system, cmd); serwer zwraca łańcuch outputu, który jest wyświetlany przez klienta). lato 2010/2011 Nie uruchamia się w środowisku BCB6. Trzeba skompilować projekt i uruchomić .exe.
Piotr Małłek Gadżet dla Windows Vista/7 lato 2010/2011 Rozszerzenie nazwy pliku .zip, zawierającego plik HTML i manifest XML, należy zmienić na .gadget.
Dawid Zarzycki Aplikacja odczytujaca i wyswietlajaca obrazy kart z biblioteki C:\Windows\System32\cards.dll lato 2010/2011
Jakub Szatkowski Aplikacja wyswietlajaca odczytane z WMI informacje o systemie lato 2010/2011
Sławomir Wawrzyniak Aplikacja wyswietlajaca zrzut ekranu z zaznaczonymi oknami lato 2010/2011 por. projekt z zajęć (JM)
Michał Gajewski Aplikacja wyświetlająca listę okien i umożliwiająca dodanie do ich tytułów numerów uchwytów lato 2010/2011 por. projekt z zajęć (JM)
Piotr Warzocha Klient poczty elektronicznej (POP3/SMTP) lato 2010/2011 Wymaga Indy.



Łukasz Rączkowski Kontrola obiektu na scenie 3D za pomocą głosu zima 2011/2012 Wymaga angielskiej wersji Windows. Lista komend: "help". Użycie komendy "load file" umożliwia wczytanie modelu z pliku *.obj. Załączone są trzy przykładowe pliki w tym formacie.
Natalia Wyczislok Wygaszacz ekranu
(śnieg spadający na okna):
Projekt (VS2010)
Pliki wykonywalne
zima 2011/2012 Pliki wykonywalne należy skopiować do katalogu Windows lub Windows\System32.
Alicja Zwiewka Aplikacja "Kolory" w czystym WinAPI zima 2011/2012
Łukasz Matczyński 1. Gadget Windows 7/Vista zmieniający tło pulpitu w zależności od bieżącej pogody:
Projekt (VS2010)
Gadżet
2. Kontrola pulpitu i okien za pomocą kamery internetowej:
Projekt (VS2010)
Pliki wykonywalne z bibliotekami OpenCV
zima 2011/2012 Uwaga! Projekt 2 działa bardzo wolno (przekazywanie obrazu przez pliki). Opiera się na OpenCV (niezbędne do kompilacji).
Przemysław Buczkowski Pobieranie i wyświetlanie tekstów piosenek do wskazanych plików mp3:
Projekt (VS2010)
Opis
zima 2011/2012
Tomasz Dzieniak Odtworzenie projektów z zajęć (BCB6) w VC++2010 (w miarę możliwości bez MFC):
Projekt (VS2010)
Pliki wykonywalne
zima 2011/2012
Justyna Lipska
Jakub Wiśniewski
Klient poczty (POP3/SMTP) na bazie WinSock:
Projekt (VS2010)
Brak projektu - do poprawy!
zima 2011/2012 Nie obsługuje SSL.
Przykładowe ustawienia konta:
Nazwa: login
Hasło: hasło
Serwer POP3: pop3.wp.pl
Port POP3: 110
Serwer SMTP: smtp.wp.pl
Port SMTP: 25
Adres e-mail: login@wp.pl



Krzysztof Chyziński Analiza i wyświetlanie funkcji eksportowanych przez biblioteki DLL
Projekt (VS2010)
zima 2012/2013
Jakub Kucharski Żarty oparte na WinAPI (The art of trolling)
Projekt (VS2010)
zima 2012/2013
Piotr Ablewski PowerShell dla programistów
Tutorial
zima 2012/2013
Sylwia Jędrzejewska Usługa Windows
Projekt (VC++)
zima 2012/2013 Uwagi