Pisze sobie prosty system pluginow, wiec dla interakcji zrobilem ich liste w programie, robie ja mniej wiecej tak:
procedure TFormPlugins.FormShow(Sender: TObject);
type
TPluginInfo = record
//Wszystkie zmienne sa statyczne - nie chcemy uzywac sharemem
Name: ShortString;
Version: Cardinal;
Author: ShortString;
Comments: ShortString;
GameExeName: ShortString;
end;
var
SearchRec: TSearchRec;
PluginInfo: TPluginInfo;
DLL: Cardinal;
GetPluginInfo: procedure(var Result: TPluginInfo); stdcall;
begin
if FindFirst('*.dll', faAnyFile, SearchRec) = 0 then begin
repeat
Memo1.Lines.Add(SearchRec.Name);
DLL := LoadLibrary(PChar(ExtractFilePath(Application.ExeName) + SearchRec.Name));
if DLL <> 0 then begin
@GetPluginInfo := GetProcAddress(DLL, 'GetPluginInfo');
GetPluginInfo(PluginInfo);
Memo1.Lines.Add('Name: ' + PluginInfo.Name + ' ' + IntToStr(PluginInfo.Version));
Memo1.Lines.Add('Author: ' + PluginInfo.Author);
Memo1.Lines.Add('Comments: ' + PluginInfo.Comments);
Memo1.Lines.Add('');
end else begin
Memo1.Lines.Add('Error when requesting info from ' + SearchRec.Name);
end;
FreeLibrary(DLL);
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;
W pierwszej linijce odczytu czegos z rekordu
Memo1.Lines.Add('Name: ' + PluginInfo.Name + ' ' + IntToStr(PluginInfo.Version));
Dostaje Access Volation (adresy to 0, czyli o ile sie nie myle to jest to odwolanie do nieisniejacej rzeczy :/ ). Taki banal a sie sypie, wie ktos o co biega?
Kod w dllce to po prostu przypisanie odpowiednich wartosci do rekordu.