AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi exportieren von Strukturen aus DLLs...

exportieren von Strukturen aus DLLs...

Ein Thema von heiopei · begonnen am 3. Mai 2006 · letzter Beitrag vom 4. Mai 2006
 
heiopei
(Gast)

n/a Beiträge
 
#1

exportieren von Strukturen aus DLLs...

  Alt 3. Mai 2006, 11: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
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz