Einzelnen Beitrag anzeigen

Benutzerbild von Bambuti2000
Bambuti2000

Registriert seit: 11. Okt 2007
Ort: Troisdorf
44 Beiträge
 
Delphi XE2 Architect
 
#1

Kurioses Problem beim Dynamischen Laden der DLL

  Alt 3. Apr 2009, 16:17
Hallo Leute,
ich bin zwar schon länger Mitglied im Forum, aber bis heute immer nur Passiv. Ich habe da so folgendes Problem bei der dynamischen Nutzung einer DLL. Ich habe mir eine DLL geschrieben, um diverse Informationen verschiedener Grafik-Dateien zu erhalten. Diese DLL habe ich dann auch erfolgreich in mein Projekt eingebunden, und, was soll ich als blutiger Hobby-Programmierer (oder einer der es werden möchte) sagen: "Hat super geklappt...". Doch nach viel leserei in Foren, habe ich mich dazu entschlossen, die DLL dynamisch einzubinden. Damit das ganze auch schön dynamisch bleibt, gehe ich sogar hin und lese zuerst die Export-Funktionen der DLL aus.
Viel geschreibe, wenig Sinn,
eigentlich klappt alles, ich bekomme sogar die richtigen Informationen ausgegeben, aber sobald ich die Informationen haben wird noch vor dem "FreeLibrary" eine Exception ausgelöst mit der Fehlermeldung: "Zugriffsverletzung bei Adresse 0x00000000..." und im Debugger kann ich keine Informationen rausbekommen.

Damit ihr euch ein Bild machen könnt, möchte ich euch den Code nicht vorenthalten:

Delphi-Quellcode:
unit LoadImgDLL;

interface

uses Windows, SysUtils, Classes, ImageHlp;

type
  TImageSize = function(FileName: PChar): integer; stdcall;
    function GetImgHeight(ImgFile: PChar{; var hSize: Integer}): integer;

implementation

procedure ListDLLExports(const FileName: string; List: TStrings);
type
  TDWordArray = array [0..$FFFFF] of DWORD;
var
  imageinfo: LoadedImage;
  pExportDirectory: PImageExportDirectory;
  dirsize: Cardinal;
  pDummy: PImageSectionHeader;
  i: Cardinal;
  pNameRVAs: ^TDWordArray;
  Name: string;
begin
  List.Clear;
  if MapAndLoad(PChar(FileName), nil, @imageinfo, True, True) then
  begin
    try
      pExportDirectory := ImageDirectoryEntryToData(imageinfo.MappedAddress,
        False, IMAGE_DIRECTORY_ENTRY_EXPORT, dirsize);
      if (pExportDirectory <> nil) then
      begin
        pNameRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
          DWORD(pExportDirectory^.AddressOfNames), pDummy);
        for i := 0 to pExportDirectory^.NumberOfNames - 1 do
        begin
          Name := PChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
            pNameRVAs^[i], pDummy));
          List.Add(Name);
        end;
      end;
    finally
      UnMapAndLoad(@imageinfo);
    end;
  end;
end;

function GetImgHeight(ImgFile: PChar): integer;
var ImgSize: TImageSize;
    Handle: THandle;
    List: TStrings;
    i: Integer;
begin
  result:=0;
  List := TStringList.Create;
  try
    ListDLLExports(PChar(ExtractFilePath(ParamStr(0))+'ImageSize.dll'), List);
    for i:=0 to List.Count-1 do
    begin
      if (pos(LowerCase(Copy(ExtractFileExt(ImgFile), 2, 7)+'h'), LowerCase(List[i]))>0) then
      begin
        Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'ImageSize.dll'));
        if Handle <> 0 then
        begin
          @ImgSize := GetProcAddress(Handle, PChar(List[i]));
          if @ImgSize <> nil then
            result := ImgSize(ImgFile); //!!!genau hier bekomme ich ein Ergebnis, aber dann ist alles futsch!!!
          FreeLibrary(Handle);
          Break;
        end;
      end;
    end;
  finally
    List.Free;
  end;
end;
Ach, und übrigens, wenn ich das Programm normal starte (aus dem Explorer) schließt sich die Anwendung an genannter Stelle einfach, ohne ein Exception in Form von Fehlermeldung auszugeben.

Ich hoffe das die Informationen ausreichend sind, und das jemand noch eine Idee hat wo und wie den Fehler suchen/beheben kann.

Thanks
Stefan
Stefan
  Mit Zitat antworten Zitat