Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO in DLL (Schutzverletzung beim Beenden der DLL) (https://www.delphipraxis.net/71317-ado-dll-schutzverletzung-beim-beenden-der-dll.html)

USchmidt 13. Jun 2006 08:38

Datenbank: nicht wichtig • Zugriff über: ADO

ADO in DLL (Schutzverletzung beim Beenden der DLL)
 
Hallo liebe Delphigemeinde !

Ich habe ein Problem mit ADO in DLL. Nach dem es im Hauptprojekt nicht funktionierte, habe ich mir ein Miniprojekt erstellt. Die DLL enhält Ihren Haupteil und ein Datenmodul.

Delphi-Quellcode:
library DLLTest;

uses
   SysUtils,
   Classes,
   Windows,
   ActiveX,
   Forms,
   DataModul in 'DataModul.pas' {DataModuleAccess: TDataModule};

{$R *.res}

var   
   DLLProcNext: procedure(Reason: Integer);STDCALL = nil;


// DLL starten/beenden
procedure Initalisation(Reason: DWORD);
begin
   case Reason of
      // DLL wird gestartet
      DLL_PROCESS_ATTACH:   
                  begin
                     CoInitialize(nil);

                     // Datenmodul erstellen
                     DataModuleAccess := nil;
                     DataModuleAccess := TDataModuleAccess.Create(nil);

                  end;   // von DLL_PROCESS_ATTACH:
      // DLL wird beendet
      DLL_PROCESS_DETACH:   
                  begin
                     // Datenmodul freigeben
                     if Assigned(DataModuleAccess) then
                     begin
                        if DataModuleAccess.ADOConAdmin.Connected then                                                          DataModuleAccess.ADOConAdmin.Close;
                        DataModuleAccess.Free;
                     end;   // von Assigned(DataModuleAccess)

                     CoUninitialize;
                  end;   // von DLL_PROCESS_DETACH:
   end;   // von case Reason of
end;

// Schnittstelle
// =============
exports

   DLL_DBOpen,
   DLL_DBClose;

begin

   // DLL wird gestartet/beendet
   DLLProcNext := Pointer(InterlockedExchange(Integer(@DLLProc),Integer(@Initalisation)));
   Initalisation(DLL_PROCESS_ATTACH);

end.
Solange ich im Datenmodul noch kein ADO-Objekt habe, funktioniert diese DLL wie zu erwarten. Sobald ich dann ein ADO-Objekt im Modul einbinde, kommt es beim beenden der DLL (DataModuleAccess.Free) zu einer kurzen Verzögerung un dann zu der Meldung "zu viele Exception" aufgetreten (unter NT/2000). Bei XP kommt eine Schutzverletzung. Lasse ich mal das "DataModuleAccess.Free" weg (ich weiß, nicht korrekt), wird die DLL unter NT/2000 ohne Fehler beendet, bei XP Schutzverletzung. Ich dachte, daß es am Datenmodul liegt und habe das Ganze noch mit einer Form probiert - identisch. Ubrigens ist es Egal, welches ADO-Objekt man verwendet (ich habe es mit "Connect" und "DataSet" probiert).

Weiß hier jemand Rat !!!


Danke für Eure Mühe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 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