Einzelnen Beitrag anzeigen

heiopei
(Gast)

n/a Beiträge
 
#1

exportieren von Strukturen aus DLLs...

  Alt 3. Mai 2006, 12:32
hallo,
ich möchte aus einer DLL eine Struktur exportieren, die Informationen zur DLL ausgibt; dies mache ich per aufruf eine funktion.

Hier der Code der DLL:
Delphi-Quellcode:
library DLLTest;

{$R *.res}
{$R meine_resource.res}

type
//Definition einer speziellen Karte
  TSpezielle = record
    Name: PChar;
    Index: Word;
  end;

  TSpezielleArray = array of TSpezielle;

  //Definition der Struktur einer KartenSammlung-Information
  TKartenSammlungInfo = record
    Name: PChar; //Name der Kartensammlung
    Version: PChar; //Version der Kartensammlung
    Karten: Byte; //Anzahl der Karten (ohne spezielle)
    Spezielle: TSpezielleArray; //vorhandene spezielle Karten mit Name und
                                     //Index
  end;

function DLLSammlungInfo(): TKartenSammlungInfo; stdcall;
begin
  with result do
  begin
    Name := 'Test der DLL';
    Version := '1.0';
    Karten := 32;
    SetLength(Spezielle, 2);
    Spezielle[0].Name := 'Speziell1';
    Spezielle[0].Index := 65534;
    Spezielle[1].Name := 'Speziell2';
    Spezielle[1].Index := 65535;
  end;
end;

exports
  DLLSammlungInfo;

end.
im hauptprogramm lade ich nun diese DLL (dynamisch) und übernehme den Rückgabewert(die Informationen) der Funktion.

Hier der Code des Hauptprogramms:

Delphi-Quellcode:
type
  //Definition einer speziellen Karte
  TSpezielle = record
    Name: PChar;
    Index: Word;
  end;

  TSpezielleArray = array of TSpezielle;

  //Definition der Struktur einer KartenSammlung-Information
  TKartenSammlungInfo = record
    Name: PChar; //Name der Kartensammlung
    Version: PChar; //Version der Kartensammlung
    Karten: Byte; //Anzahl der Karten (ohne spezielle)
    Spezielle: TSpezielleArray; //vorhandene spezielle Karten mit Name und
                                     //Index
  end;

  PTKartenSammlungInfo = ^TKartenSammlungInfo;

  //Definition der Funktion, die von einer Kartensammlung erwartet wird
  TDLLSammlungInfo = function(): TKartenSammlungInfo; stdcall;


procedure KopiereInfo(QuelleInfo: PTKartenSammlungInfo; var ZielInfo: TKartenSammlungInfo);
var
  b: Byte;
begin
  with ZielInfo do
  begin
    Name := QuelleInfo.Name;
    Version := QuelleInfo.Version;
    Karten := QuelleInfo.Karten;
    SetLength(Spezielle, Length(QuelleInfo.Spezielle)); //FEHLER
    for b := 1 to Length(QuelleInfo.Spezielle) do //FEHLER
      Spezielle[b - 1] := QuelleInfo.Spezielle[b - 1]; //FEHLER
  end;
end;

function CheckSammlung(Sammlung: string): Boolean;
var
  KartenLib: THandle; //Handle auf die DLL
  DLLSammlungInfo: TDLLSammlungInfo; //Addresse der Funktion
  Info: TKartenSammlungInfo; //Infos von der DLL
begin
  result := false;
  Sammlung := ExtractFilePath(ParamStr(0)) + PluginPfad + Sammlung;

  KartenLib := LoadLibrary(PChar(Sammlung));
  if KartenLib <> 0 then
  begin
    @DLLSammlungInfo := GetProcAddress(KartenLib, 'DLLSammlungInfo');
    if Assigned(DLLSammlungInfo) then
    begin
      KopiereInfo(@DLLSammlungInfo, Info);
      //Anzeigen der Informationen (mit zwei speziellen Karten)
      MessageBox(0, PChar('Name: ' + Info.Name + #10 +
                          'Version: ' + Info.Version + #10 +
                          'Kartenzahl: ' + IntToStr(Info.Karten) + #10 +
                          'Spezielle: ' + IntToStr(Length(Info.Spezielle)) + #10 +
                          'Sp1: ' + Info.Spezielle[0].Name + ' / ' +
                                    IntToStr(Info.Spezielle[0].Index) + #10 +
                          'Sp2: ' + Info.Spezielle[1].Name + ' / ' +
                                    IntToStr(Info.Spezielle[1].Index)
                          ), '', 0);}
    end;
  end;
  FreeLibrary(KartenLib);
end;
Das Problem: irgendo tritt eine AV auf. jetzt hab ich nach etwas debuggen rausgefunden, dass dieser beim übernehmen des Spezielle-Arrays auftritt. Allerdings kann ich die ursache für das problem nicht finden - liegt das am exportieren von solchen etwas komplexeren strukturen (-> anderer lösungsweg?) oder mache ich den fehler (-> wo )

danke für hilfe,
heiopei
  Mit Zitat antworten Zitat