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.
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),Inte ger(@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.
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.
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),Inte ger(@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.