Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Abstutz nach DLL zugriff (https://www.delphipraxis.net/68581-abstutz-nach-dll-zugriff.html)

Harry M. 2. Mai 2006 03:20


Abstutz nach DLL zugriff
 
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
Delphi-Quellcode:
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??

SirThornberry 2. Mai 2006 05:06

Re: Abstutz nach DLL zugriff
 
hast du im DLL-Projekt den Text gelesen der ganz oben steht? Wenn du zwischen DLL und Hauptprogramm mit Strings hantierst solltest du dir den Text mal in Ruhe durchlesen.

Harry M. 2. Mai 2006 07:45

Re: Abstutz nach DLL zugriff
 
Morgen Sir!

Habe ich gelesen und die ShareMem eingebunden.

Tonic1024 2. Mai 2006 08:10

Re: Abstutz nach DLL zugriff
 
Schon mal diesen Konstrukt für dynamischen DLL-Zugriff versucht?

Delphi-Quellcode:
type
  Tfunc = function(Bla: String): Integer;

function CallFunc(sowiso: String):Integer;
var func: Tfunc ;
    Handle: THandle;
    filepath: string;
    DefResult: integer;
begin
  DefResult:=0;
  filepath:=ExtractFilePath(ParamStr(0))+ProgramFiles.Path;
  Handle:=LoadLibrary(@filepath[1]);
  if Handle <> 0 then
  begin
    @func:= GetProcAddress(Handle, 'MyDLLFunc');
    if @func <> nil then
    begin
      DefResult:=func(Gruppen, Fahrer, Abteilung, Modus);
    end;
    FreeLibrary(Handle);
  end;
  Result:=DafResult;
end;
Toni

Harry M. 4. Mai 2006 02:55

Re: Abstutz nach DLL zugriff
 
Hat leider auch nicht geklappt.
Habe die DLL etwas umgebaut - Viele Wege führen nach Rom :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz