Kann es sein, das die
DLL das Problem ist?
Wenn ich ein Datenmodul in einer
DLL verwende, nutze ich in der
DLL.dpr immer folgende Routinen:
Delphi-Quellcode:
library myDLL;
uses
ShareMem,
MyDatenmodul
in '
MyDatemodul.pas'
{MyDatenmodul: TDataModule},
...
resourcestring
//-- Datenbank DLL Vorgaben -------------------------------------------------
dllPath = '
plugins';
//-- Datenbank DLL Fehlermeldungen ------------------------------------------
dllPathError = '
Der PlugIn Ordner %s konnte nicht erstellt werden';
dllCoInitError = '
%s hat einen CoInitialize-Fehler gemeldet!';
dllDMCreateError = '
%s hat einen Fehler beim Erzeugen des Datenmoduls %s gemeldet!';
{$R *.RES}
var DLLProcNext :
procedure(Reason: Integer);
stdcall =
nil;
bDoCoUninitialize : Boolean;
bDoDestroyDM_ADO : Boolean;
// ============================================================================
// Interne - Hilfsfunktionen
// ============================================================================
// ----------------------------------------------------------------------------
// function DBInit: Integer; stdcall;
// ----------------------------------------------------------------------------
// Funktion...: Alle Eemente der DLL initialisieren bzw erzeugen
// Parameter..: keine
// Erreichbar.: intern
function DBInit: boolean;
stdcall;
var sMsg:
string;
begin
Result := true;
try;
//-- ActivX initialisieren ------------------------------------------------
sMsg:= Format(dllCoInitError, [dllName]);
CoInitialize(
nil); bDoCoUninitialize := True;
//-- Datenmodul erzeugen --------------------------------------------------
sMsg:= Format(dllDMCreateError, [dllName, DatTable]);
MyDatenmodul:= TMyDatemodul.Create(Application);
except; ShowMessage(sMsg); Result := false;
end;
end;
// ----------------------------------------------------------------------------
// function DBUnInit: Integer; stdcall;
// ----------------------------------------------------------------------------
// Funktion...: Datenmodul deinitialisieren
// Parameter..: keine
// Erreichbar.: intern
function DBUnInit: boolean;
stdcall;
begin
Result := true;
bDoCoUninitialize := false;
bDoDestroyDM_ADO := false;
try
if bDoDestroyDM_ADO
then
MyDatemodul.Free;
if bDoCoUninitialize
then
CoUninitialize;
except
Result := false;
end;
end;
// ----------------------------------------------------------------------------
// procedure DLLMain(Reason: Integer); stdcall;
// ----------------------------------------------------------------------------
// Funktion...: eigene Strukturen und Objekte initialisieren
// Parameter..: [Reason] == Grund des Aufrufs
// Erreichbar.: intern
procedure DLLMain(Reason: Integer);
stdcall;
begin
case Reason
of
//-- Die DLL wurde in den Speicherbereich des akt. Prozesses geladen ------
DLL_PROCESS_ATTACH :
begin
DisableThreadLibraryCalls(hInstance);
DBInit;
end;
//-- Der aktuelle Prozeß erzeugt einen neuen Thread -----------------------
DLL_THREAD_ATTACH :
begin
end;
//-- Ein Thread wird beendet ----------------------------------------------
DLL_THREAD_DETACH :
begin
end;
//-- Die DLL wird wieder aus dem Speicherbereich des akt.Prozesses entfernt
DLL_PROCESS_DETACH :
begin
DBUnInit;
end;
end;
if Assigned(DLLProcNext)
then DLLProcNext(Reason);
end;
// ============================================================================
// Initialisierungscode
// ============================================================================
begin
DLLProcNext := Pointer(InterlockedExchange(Integer(DLLProc),Integer(@DLLMain)));
DLLMain(DLL_PROCESS_ATTACH);
end.
Ich habe das irgendwo aus dem Netz. Hoffe es hilft dir weiter.
Human are Human to make mistakes.