Ich muss etwas Code (Compiliert ~150KB) in eine
DLL auslagern. Um die restlichen Exen der Projektes kleiner zuhalten bzw um Programm-Teile zur Laufzeit austauschen zukönnen ohne das das Hauptprogramm beendet werden muss. Sowei funtz das Ganze auch nur bei
FreeLibrary(DLLHandle)
schmiert das ganze Programm ab, in der Art das es einfach mit einer
AV beendet (Prog hängt sich nicht auf sondern schliesst sich).
Das Hauptprogramm
Delphi-Quellcode:
procedure OpenFile2HashDll(ADllFilename: String; APath: String; AFileList: TStringList);
var
FileListForHash : TFileListForHash;
FuncPtr : TFarProc;
DLLHandle : THandle;
begin
DLLHandle := LoadLibrary( PChar(ADllFilename) );
FuncPtr := GetProcAddress(DLLHandle, 'FileListForHash');
if FuncPtr <> nil then begin
@FileListForHash := FuncPtr;
FileListForHash(APath, AFileList);
FuncPtr := nil;
end;
FreeLibrary(DLLHandle); // Hier knalls -> Programm-Ende! Auch ein Try-Except-Block hilft nicht.
end;
procedure TForm1.Button1Click(Sender: TObject);
var
sl: TStringList;
begin
sl := TSTringList.Create;
OpenFile2HashDll('.\F2H32.dll', ExtractFilePath(ParamStr(0)) + '*.*', sl);
sl.SaveToFile('.\test.txt'); // hier komme ich schon gar nicht mehr vorbei :-(
sl.Free;
end;
Die
DLL
Delphi-Quellcode:
procedure FileListForHash(APath: String; AFileList: TStringList); Export;
var
I: Integer;
slTmp: TStringList;
begin
slTmp := TStringList.Create;
GetAllFiles(APath, slTmp); // alle dateien suchen, in slTmp schreiben
for I := 0 to slTmp.Count-1 do // und alle gefunden hashen
AFileList.Add( slTmp.Strings[I] + '|' + IntToStr(GetFileSize(slTmp.Strings[I])) + '|' + GetHash(slTmp.Strings[I]) );
slTmp.Free;
// und die AFileList wieder zurück in das Hauptprogramm
end;
exports
FileListForHash;
Hat jemand eine Idee??