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.