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