Entwickler-Ecke

Dateizugriff - DLL Zugriffsverletzung borlndmm.dll


MisterBum83 - Mi 18.11.09 17:28
Titel: DLL Zugriffsverletzung borlndmm.dll
Hallo zusammen,

ich habe ein sehr merkwürdiges Problem:
Ich lade bzw. entlade eine selbsterstellte DLL-Datei über LoadLibrary bzw. FreeLibrary. Funktioniert beim ersten Mal auch alles perfekt. Nur wenn ich anschließend direkt wieder die DLL lade, so stürzt mein Aufrufprogramm beim FreeLibrary ab mit einem RuntimeError oder Zugriffsverletzung in der borlndmm.dll ab. Manchmal aber auch direkt beim ersten Mal, aber immer beim FreeLibrary. ShareMem ist überall, d.h. in der Projektdatei der DLL und des Aufrufprogramms eingebunden.

Ich weiß leider nicht mehr weiter! Hat von euch jemand eine Idee???


Gruß MisterBum


platzwart - Mi 18.11.09 17:52

Ohne ein wenig Quellcode können wir nur wild raten...


MisterBum83 - Do 19.11.09 09:20

Sorry, hier mal ein wenig Code:

DLL:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
library DLL;

uses
  Sharemem,
  SysUtils,
  ...


function StarteDLL(
  AOwner: HWND;
  Var1, Var2, Var3: pchar;
  Var4: boolean;
  Var5: HKEY;
  Var6: pansichar;
  Var7: integer
  ): boolean; stdcall;
begin
  result := false;
  if AOwner = 0 then
    exit;

  Application.Handle := AOwner;
  try
    // Formulare erzeugen 
    try
    ...
    finally
     // Formulare freigeben
    end;
  finally
    Application.Handle := 0;
  end;
end;

exports
  StarteDLL;

begin

end.


Aufrufendes Programm:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
program Test;

uses
  ShareMem,
  Forms,
  ...


Aufuf in Unit:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
DLL_Handle := LoadLibrary('DLL');
  if handle = 0 then
    begin
      MessageDlg('DLL konnte nicht geladen werden.', mtError, [mbOK], 0);
      exit;
    end;
  try
    @StarteDLL := GetProcAddress(DLL_Handle, 'StarteDLL');
    if @StarteDLL = nil then
      begin
        MessageDlg('Startfunktion konnte in DLL nicht gefunden werden.', mtError, [mbOK], 0);
        exit;
      end;

    if StarteDLL(
      Application.Handle,
      PChar(Var1),
      PChar(Var2),
      PChar(Var3),
      Var4, 
      Var5,
      PAnsiChar(Var6),
      Var7) then
      begin
        // MessageDlg('DLL wurde erfolgreich beendet.', mtInformation, [mbOK], 0);
      end
    else
      begin
        MessageDlg('DLL wurde nicht erfolgreich beendet.', mtInformation, [mbOK], 0);
      end;
  finally
    @StarteDLL := nil;
    FreeLibrary(DLL_Handle);
    DLL_Handle := 0;
  end;



Lass ich das FreeLibrary weg, so stürzt mein Programm ab, sobald ich es komplett beende.