Einzelnen Beitrag anzeigen

USchmidt

Registriert seit: 12. Jun 2006
Ort: Friedberg
2 Beiträge
 
#1

ADO in DLL (Schutzverletzung beim Beenden der DLL)

  Alt 13. Jun 2006, 08:38
Datenbank: nicht wichtig • Zugriff über: ADO
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.
Es ist besser, den Kopf über den Aufgaben und nicht die Aufgaben über den Kopf wachsen zu lassen.
  Mit Zitat antworten Zitat