a więc tak
Wtyczka zaczyna działać i po odpaleniu odtwarza mi dźwięk powitalny przy starcie aqq
Mam jednak pewien kłopot ze ścieżkami względnymi. Odnoszę wrażenie, że przy wywoływaniu dll-ki z poziomu aqq nie wiadomo, w jakiej lokalizacji znajduje się wtyczka. z tego powodu odwołanie się do względnej ścieżki nie działa na przykład zamiast pisać plik:='audio.wav' muszą pisać plik:=C:/katalog/audio/muzyczka/audio.wav';
Jest to szczególnie kłopotliwe przy próbie zapisu/odczytu ustawień wtyczki z pliku strukturalnego 'ustawienia.plgaqq'. Otrzymuję wówczas komunikat "File access denied". Przy tradycyjnych projektach aplikacji VCL nie ma żadnych zgrzytów tego typu.
Oto źródłowy kod mojej wtyczki
//Główny plik
library MojaWtyczka;
uses
SysUtils,
Windows,
MMSystem,
PluginAPI,
Dialogs,
Unit2 in 'Unit2.pas',
Unit3 in 'Unit3.pas' {Form3};
var
PluginInfo: TPluginInfo;
PluginLink: TPluginLInk;
sciezka:PChar;
{$R *.res}
function AQQPluginInfo(AQQVersion: Dword): PpluginInfo; stdcall;
begin
PluginInfo.Author:='gnomiuszka';
PluginInfo.ShortName:='Poszukiwacz';
PluginInfo.Version:=PLUGIN_MAKE_VERSION(0,0,0,1);
PluginInfo.Flag:=0;
PluginInfo.Description:='Szukaj słów kluczowych w wybranej rozmowie lub we wszystkich rozmowach z wybranym kontaktem. Wtyczka działa na zasadzie funkcji znajdowania (ctrl+F)';
PluginInfo.ReplaceDefaultModule:=0;
PluginInfo.cbSize:=SizeOf(TPluginInfo);
Result:=@PluginInfo;
end;
Function OnModulesLoaded(wParam, LParam: integer):integer; stdcall;
begin
playsound('E:/onLoad.wav', 0, SND_FILENAME);
//działa tylko na bezwzględnej scieżce
//jak odwołać się do lokalizacji?
//chodzi o coś akiego
//sciezkapliku:=AQQ_USED_PROFILE_LOCATION+'/plugins/mojawtyczka/onLoad.wav'
result:=0;
end;
function Load(link: PPluginLink): Integer; stdcall;
begin
PluginLink:=Link^;
PluginLink.HookEvent(AQQ_SYSTEM_MODULESLOADED, OnModulesLoaded);
Result:=0;
end;
function UnLoad: Integer; stdcall;
begin
Result:=0;
PluginLink.UnhookEvent(Thandle(@OnModulesLoaded));
playsound(nil, 0, SND_PURGE);//zatrzymanie odtwarzania
end;
Function Settings: Integer; stdcall;
begin
result:=0;
if not Assigned(Form2) then
begin
Form3 := TForm3.Create(nil);
end;
Form3.ShowModal;
FreeAndNil(Form3);
end;
exports
Load,
Unload,
AQQPluginInfo,
Settings;
begin
end.
a to kod odpowiedzialny za okno ustawień i zapisywanie ustawień
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, MMSystem;
type
TForm3 = class(TForm)
GroupBox1: TGroupBox;
w_rozmowie: TCheckBox;
w_archiwum: TCheckBox;
GroupBox2: TGroupBox;
wybr_rozmowa: TRadioButton;
wszyst_rozm: TRadioButton;
GroupBox3: TGroupBox;
przycisk: TCheckBox;
skrot: TCheckBox;
klawisz: TEdit;
GroupBox4: TGroupBox;
Edit2: TEdit;
Button1: TButton;
OpenDialog1: TOpenDialog;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure w_archiwumClick(Sender: TObject);
procedure skrotClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
sciezkapliku: string='E:/OnLoad';
type PluginSet= packed record
w_rozmowie: bool;
w_archiwum: bool;
calearchiwum: bool;
wybrana_rozmowa: bool;
przycisk:bool;
skrot:bool;
klawisz: string[10];
end;
var
ustaw:PluginSet;
plik: file of PluginSet;
const nazwapliku='ustawienia.plgaqq';
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
sciezkapliku:=OpenDialog1.FileName;
Edit2.Text:=sciezkapliku;
//ustawienie pliku audio odgrywanego przy starcie
end;
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
playsound(PChar(sciezkapliku), 0, SND_ASYNC);
//test pliku
end;
procedure TForm3.Button3Click(Sender: TObject);
begin
//zapis ustawień do pliku
assignfile(plik, nazwapliku);
//w normalnych projektach działa, ale tu otrzymuję komunikat File access denied
ReWrite(plik);
seek(plik, 0);
ustaw.w_rozmowie:=w_rozmowie.Checked;
ustaw.w_archiwum:=w_archiwum.checked;
ustaw.calearchiwum:=wszyst_rozm.Checked;
ustaw.wybrana_rozmowa:=wybr_rozmowa.Checked;
ustaw.przycisk:=przycisk.Checked;
ustaw.skrot:=skrot.Checked;
ustaw.klawisz:=klawisz.Text;
write(plik, ustaw);
closefile(plik);
end;
procedure TForm3.w_archiwumClick(Sender: TObject);
begin
groupBox2.Enabled:=w_archiwum.Checked;
end;
procedure TForm3.skrotClick(Sender: TObject);
begin
klawisz.Enabled:=skrot.Checked;
end;
end.