Autor Beitrag
MisterBum83
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 245
Erhaltene Danke: 2

WIN XP
Delphi 6
BeitragVerfasst: Mi 18.11.09 17:28 
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Mi 18.11.09 17:52 
Ohne ein wenig Quellcode können wir nur wild raten...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
MisterBum83 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 245
Erhaltene Danke: 2

WIN XP
Delphi 6
BeitragVerfasst: Do 19.11.09 09:20 
Sorry, hier mal ein wenig Code:

DLL:

ausblenden volle Höhe 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:

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

uses
  ShareMem,
  Forms,
  ...


Aufuf in Unit:

ausblenden volle Höhe 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.