« Powrót

Jak stworzyć własną wtyczkę do AQQ w C++

  Do AQQ dołączone zostało SDK, które umożliwia niezależnym programistom tworzenie różnego rodzaju wtyczek do tego komunikatora. Niestety dostępne jest jedynie w Delphi, co wielu może zniechęcić do spróbowania swoich sił w pisaniu pluginów, dlatego właśnie zdecydowałem się przetłumaczyć SDK na C++ i napisać ten artykuł.

  Jako środowiska użyję Microsoft Visual C++ 2008 Express Edition.

  1. Rozpoczynamy od utworzenia projektu, jako typ wybieramy bibliotekę DLL.
    Krok 1 Krok 2
  2. Pobieramy plik AQQ SDK (15.87 KB), kopiujemy w miejsce źródeł projektu i dołączamy go (Project->Add Existing Item...), następnie tworzymy pliki main.cpp i main.def (Project->Add New Item...).

    main.def:
    1. EXPORTS
    2.   Load
    3.   Unload
    4.   AQQPluginInfo

    Krok 3
  3. Przechodzimy do ustawień projektu (PPM na projekt i Properties) i ustawiamy opcje tak, jak na załączonych screenach.
    Krok 4 Krok 5
    Jako ścieżkę docelową wybieramy folder, w którym znajdują się wtyczki do AQQ.
    Krok 6
  4. Pisanie wtyczki zaczynamy od dołączenia dwóch plików nagłówkowych do głównego modułu programu, kilku zmiennych globalnych i definicji funkcji zwrotnych:
    1. #include <windows.h>
    2. #include "aqq.h"
    3.  
    4. TPluginInfo PluginInfo;
    5. TPluginLink* PluginLink;
    6.  
    7. THandle OnModulesLoadedHandle;
    8.  
    9. int OnModulesLoaded (int wParam, int lParam);
  5. Następnie dodajemy główną funkcję wtyczki - AQQPluginInfo, zwraca ona wskaźnik na strukturę wypełnioną podstawowymi informacjami o wtyczce.
    1. TPluginInfo* AQQPluginInfo (int AQQVersion)
    2. {
    3.   PluginInfo.cbSize = sizeof (TPluginInfo);
    4.   PluginInfo.ShortName = L"Test";
    5.   PluginInfo.Version = PLUGIN_MAKE_VERSION (1, 0, 0, 0);
    6.   PluginInfo.Description = L"Opis";
    7.   PluginInfo.Author = L"Krystian Dużyński";
    8.   PluginInfo.AuthorMail = L"krystekd@gmail.com";
    9.   PluginInfo.Copyright = L"Prawa autorskie";
    10.   PluginInfo.Homepage = L"http://krystiand.net";
    11.   PluginInfo.Flag = 0;
    12.   PluginInfo.ReplaceDefaultModule = 0;
    13.  
    14.   return &PluginInfo;
    15. }
  6. Kolejnym krokiem jest stworzenie funkcji odpowiedzialnej za łączenie interfejsu AQQ z wtyczką. W tej funkcji łączymy interesujące nas notyfikacje z odpowiednimi funkcjami wewnątrz wtyczki jak również pobieramy i zapisujemy adres przekazanej struktury:
    1. int Load (TPluginLink* Link)
    2. {
    3.   PluginLink = Link;
    4.  
    5.   OnModulesLoadedHandle = PluginLink->HookEvent (AQQ_SYSTEM_MODULESLOADED, OnModulesLoaded);
    6.   return 0;
    7. }
  7. Tworzymy funkcję obsługi przykładowej notyfikacji (tu AQQ_SYSTEM_MODULESLOADED):
    1. int OnModulesLoaded (int wParam, int lParam)
    2. {
    3.   MessageBox (0, L"OnModulesLoaded", L"Hello", 0);
    4.   return 0;
    5. }
  8. Nie możemy zapomnieć o zwolnieniu pamięci i notyfikacji używanych przez wtyczkę. Realizujemy to za pomocą funkcji Unload:
    1. int Unload ()
    2. {
    3.   PluginLink->UnhookEvent (OnModulesLoadedHandle);
    4.   return 0;
    5. }
  9. Jeśli nasza wtyczka posiada ustawienia, do pliku main.def dopisujemy linijkę
    1.   Settings
    Natomiast w pliku main.cpp taką funkcję:
    1. int Settings ()
    2. {
    3.   MessageBox (0, L"Ustawienia wtyczki", L"Hello", 0);
    4.   return 0;
    5. }
  10. Nasz kod powinien wyglądać mniej więcej tak:
    Krok 7
  11. Klikamy Debug->Start Debugging, w okienku podajemy ścieżkę do pliku wykonywalnego programu AQQ i klikamy OK.
    Krok 8
  12. To potężne środowisko, jakim jest Visual C++, pozwala nam debuggować wtyczkę w trakcie wykonywania programu AQQ, jest to bardzo przydatne, gdyż skraca czas szukania błędów. Możemy m.in. wykonywać wtyczkę linijka po linijce (ustawiając Breakpoint na linijce poprzez kliknięcie belki po lewej) i podglądać wartości zmiennych.
    Krok 9
  13. Mam nadzieję, że komuś się ten artykuł przyda i, że dzięki niemu powstanie jeszcze więcej wtyczek do tego komunikatora :)

Copyright © KrystianD

Valid XHTML 1.0 Transitional Poprawny CSS!

lektorzy | stojaki reklamowe | aranżacja wnętrz warszawa | edeweb | zespół na weselaHotels europe | doradca podatkowy dąbrowa górnicza | Spain Hotels | siatka zgrzewana | konto w banku | prezentacje multimedialne | strony www warszawa | volvo c70 | Nocne, nielegalne wyścigi uliczne