« 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.
-
Rozpoczynamy od utworzenia projektu, jako typ wybieramy bibliotekę DLL.
-
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:
EXPORTS
Load
Unload
AQQPluginInfo
- Przechodzimy do ustawień projektu (PPM na projekt i Properties) i ustawiamy opcje
tak, jak na załączonych screenach.

Jako ścieżkę docelową wybieramy folder, w którym znajdują się wtyczki do AQQ.
-
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:
#include <windows.h>
#include "aqq.h"
TPluginInfo PluginInfo;
TPluginLink* PluginLink;
THandle OnModulesLoadedHandle;
int OnModulesLoaded (int wParam, int lParam);
-
Następnie dodajemy główną funkcję wtyczki - AQQPluginInfo, zwraca ona wskaźnik
na strukturę wypełnioną podstawowymi informacjami o wtyczce.
TPluginInfo* AQQPluginInfo (int AQQVersion)
{
PluginInfo.cbSize = sizeof (TPluginInfo);
PluginInfo.ShortName = L"Test";
PluginInfo.Version = PLUGIN_MAKE_VERSION (1, 0, 0, 0);
PluginInfo.Description = L"Opis";
PluginInfo.Author = L"Krystian Dużyński";
PluginInfo.AuthorMail = L"krystekd@gmail.com";
PluginInfo.Copyright = L"Prawa autorskie";
PluginInfo.Homepage = L"http://krystiand.net";
PluginInfo.Flag = 0;
PluginInfo.ReplaceDefaultModule = 0;
return &PluginInfo;
}
-
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:
int Load (TPluginLink* Link)
{
PluginLink = Link;
OnModulesLoadedHandle = PluginLink->HookEvent (AQQ_SYSTEM_MODULESLOADED, OnModulesLoaded);
return 0;
}
-
Tworzymy funkcję obsługi przykładowej notyfikacji (tu AQQ_SYSTEM_MODULESLOADED):
int OnModulesLoaded (int wParam, int lParam)
{
MessageBox (0, L"OnModulesLoaded", L"Hello", 0);
return 0;
}
-
Nie możemy zapomnieć o zwolnieniu pamięci i notyfikacji używanych przez wtyczkę.
Realizujemy to za pomocą funkcji Unload:
int Unload ()
{
PluginLink->UnhookEvent (OnModulesLoadedHandle);
return 0;
}
-
Jeśli nasza wtyczka posiada ustawienia, do pliku main.def dopisujemy linijkę
Natomiast w pliku main.cpp taką funkcję:
int Settings ()
{
MessageBox (0, L"Ustawienia wtyczki", L"Hello", 0);
return 0;
}
-
Nasz kod powinien wyglądać mniej więcej tak:
-
Klikamy Debug->Start Debugging, w okienku podajemy ścieżkę do pliku
wykonywalnego programu AQQ i klikamy OK.
-
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.
-
Mam nadzieję, że komuś się ten artykuł przyda i, że dzięki niemu powstanie
jeszcze więcej wtyczek do tego komunikatora :)
|