FindFirst/Next, DLL, referencja do rekordu i AV

0

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.

0

AV może wynikać z linii GetPluginInfo(PluginInfo);, ale nie jestem pewien - rekody do parametrów najlepiej jest przekazywać przez wskaźnik (najłatwiej) - zresztą nie tylko w DLL`ce .. może to coś da..

0

AV może wynikać z linii GetPluginInfo(PluginInfo);,

Do tej lini spokojnie dochodzil bez sypania. :(

Gdyby nie to, ze w innym miejscu spokojnie odczytywalem w ten sposob infomacje z dll (var rekord) pomyslal bym, ze tak sie nie da...

0

Moze ze strony DLL'a

ja wkleilem kod na <ort>rzywca </ort>i dziala z bibloteka

library Project1;

uses
SysUtils,
Classes;

{$R *.res}

type
TPluginInfo = record
//Wszystkie zmienne sa statyczne - nie chcemy uzywac sharemem
name: ShortString;
Version: Cardinal;
Author: ShortString;
Comments: ShortString;
GameExeName: ShortString;
end;
procedure GetPluginInfo(var Result: TPluginInfo); stdcall;
begin
with result do
begin
name:='Plugin';
Version:=1;
Author:='ja';
Comments:='brak c';
GameExeName:='22';
end;
end;
exports
GetPluginInfo;
begin
end.

0

Kurcze teraz wszystko jest ok, jedyne co mi do glowy przychodzi to dllka bez GetPluginInfo w katalogu z programem (kompiluje je w osobnych folderach) [wstyd] , dzieki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1