Jak zacząć?
Poniższy opis zakłada użycie środowiska programistycznego CodeGear Borland Delphi. Jednak, można go łatwo przekonwertować do użycia na dowolnym innym kompilatorze np. C++. Zaczynamy od stworzenia nowej biblioteki DLL, ponieważ wtyczki dla AQQ są właśnie dynamicznie wczytywanymi bibliotekami.
Wyeksportowane funkcje
Aby AQQ mogło wczytać wtyczkę, biblioteka DLL musi posiadać kilka wyeksportowanych funkcji. Pierwsza z nich, odpowiada za poinformowanie AQQ, że wtyczka jest zgodna z AQQ, i zawiera wstępne informacje na temat wtyczki. Pierwszą wyeksportowaną funkcją powinna być funkcja o nazwie AQQPluginInfo. Funkcja otrzymuje jako parametr wchodzący "AQQVersion" wersję AQQ, która wywołuje wtyczkę. Funkcja powinna zwrócić wypełnioną strukturę PPluginInfo. Przykład użycia wygląda następująco:

function AQQPluginInfo(AQQVersion: DWord): PPluginInfo; stdcall;
begin
PluginInfo.cbSize := SizeOf(TPluginInfo);
PluginInfo.ShortName := PLUGIN_SHORTNAME;
PluginInfo.Version := PLUGIN_MAKE_VERSION(1,0,0,0); // Implementacja
PluginInfo.Description := 'Moja własna wtyczka do AQQ - Hello';
PluginInfo.Author := 'Imie i nazwisko autora';
PluginInfo.AuthorMail := 'autor@wtyczki.pl';
PluginInfo.Copyright := 'Prawa autorskie posiada...';
PluginInfo.Homepage := 'http://strona.domowa.wtyczki.pl';
PluginInfo.Flag := 0;
PluginInfo.ReplaceDefaultModule := 0;
Result := @PluginInfo;
end;

Kolejnym krokiem jest stworzenie funkcji, służącej do łączenia interfejsu AQQ z wtyczką. Realizuje to funkcja o nazwie "Load", której parametrem wchodzącym jest wskaźnik na strukturę PPluginLink. Struktura ta, powinna zostać zachowana przez plugin, ponieważ później, wtyczka będzie realizowała połączenie właśnie przez tą strukturę. Przykład użycia wygląda następująco:

function Load(Link: PPluginLink): Integer; stdcall;
begin
PluginLink := Link^; // Przechowujemy link do interfejsu AQQ w globalnej zmiennej.

// Możemy podłączyć się również, do notyfikacji które będą nas interesować.
PluginLink.HookEvent(AQQ_SYSTEM_MODULESLOADED, OnModulesLoaded);
Result := 0;
end;

Zauważmy że od razu podłączyliśmy się pod wybrane notyfikacje. W tym konkretnym wypadku, dołączyliśmy się do notyfikacji AQQ_SYSTEM_MODULESLOADED, która informuje że AQQ zakończyło wczytywanie wszystkich znalezionych wtyczek. Oczywiście możemy podpinać się pod dowolne notyfikację. Kolejną potrzebną funkcją będzie funkcja "Unload", służąca do wyładowywania wtyczki z pamięci. Wtyczka, powinna zwolnić wszystkie zasoby z których do tej pory korzystała. Musi zniszczyć wszystkie obiekty które stworzyła (również w interfejsie AQQ), jak i odłączyć się od wszelkich notyfikacji do których wcześniej się podczepiła. Przykład użycia wygląda następująco:

function Unload: Integer; stdcall;
begin
Result := 0;
PluginLink.UnhookEvent(THandle(@OnModulesLoad));
if Assigned(frmSettings) then FreeandNil(frmSettings);
end;

Jeżeli nasza wtyczka posiada ustawienia, a załóżmy że posiada. Powinniśmy wyeksportować jeszcze jedną, już ostatnią funkcje o nazwie "Settings". Powinna ona otwierać okno ustawień wtyczki. Przykład użycia wygląda następująco:

function Settings: Integer; stdcall;
begin
Result := 0;
if not Assigned(frmSettings) then
begin
frmSettings := TfrmSettings.Create(nil);
end;
frmSettings.ShowModal;
FreeAndNil(frmSettings);
end;

To już prawie koniec naszej prostej wtyczki. Teraz dodajmy już tylko funkcję OnModulesLoaded, która odbierze naszą podczepioną notyfikację z interfejsu AQQ. Musimy też pamiętać o wyeksportowaniu naszych stworzonych funkcji. Zobaczmy jak może to wyglądać:

function OnModulesLoad(wParam, lParam: DWord): Integer; stdcall;
begin
Result := 0;
ShowMessage('Hello!');
end;

exports
Load,
Unload,
AQQPluginInfo,
Settings;

Na koniec, stworzoną bibliotekę DLL wgrywamy w odpowiednią lokację (tam gdzie użytkownik trzyma swoje wtyczki). Po uruchomieniu AQQ, i wczytaniu wszystkich wtyczek, nasza wtyczka wyświetli komunikat "Hello!" na ekranie. Nic lepiej nie obrazuję sposobu tworzenia wtyczki niż gotowy przykład. Źródła powyższej najprostszej możliwej wtyczki można pobrać tutaj. Do skompilowania tej wtyczki będzie potrzebny również plik nagłówkowy, który można pobrać tutaj.

Opcjonalnie możemy też dodać własną ikonkę reprezentującą naszą wtyczkę, tak aby taka ikona była widoczna obok nazwy wtyczki w ustawieniach AQQ. Aby to zrobić, wtyczka po uruchomieniu powinna umieścić ikonkę w formacie PNG (32x32px) w lokalnym profilu użytkownika tj. [katalog profilu użytkownika\Plugins\Shared (jeżeli katalog nie istnieje to należy go stworzyć). Ikona powinna mieć nazwę w formacie: nazwa_wtyczki.dll.png.