Wenn du den Code in einer Komponente verwenden willst, kannst du ein Feld für den
DLL-Namen und ein Feld für die Tabelle vorsehen. Anstelle der String-Konstanten werden dann in der Fehlermeldung halt die Werte der Felder angezeigt.
Du kannst auch die Fehlermeldungen aus dem Code nehmen und darauf hoffen, das es ohne Fehler läuft.
Delphi-Quellcode:
library myDLL;
uses
ShareMem,
MyDatenmodul
in '
MyDatemodul.pas'
{MyDatenmodul: TDataModule},
...
{$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;
begin
Result := true;
try;
//-- ActivX initialisieren ------------------------------------------------
CoInitialize(
nil);
bDoCoUninitialize := True;
//-- Datenmodul erzeugen --------------------------------------------------
MyDatenmodul:= TMyDatemodul.Create(Application);
except
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.
Ein Problem stellt noch die Verwendung von ShareMem dar. Wenn du eine Komponente entwickelst, muss dem Anwender mitgeteilt werden, das er im Projekt die
Unit ShareMem in der Projekt Datei einbinden muss. Ansonsten kommt es zu nicht nachzuvollziehbaren Fehlern.
Delphi-Quellcode:
program netguide;
uses
ShareMem,
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Ich habe bei mir nur eine
Unit für die Allgemeine Verwendung des DM in einer
DLL geschrieben. Die füge ich zu meinem Project hinzu, lege ein DM an und arbeite dann wie gewohnt in der
IDE. Die
DLL-Namen und Tabellen-Konstanten lege ich in einer Res oder Inc Datei ab, die ich mit folgendem Aufruf in das Project mit einbinde.
{$I 'meineKonstanten.inc'}
Ich hoffe, das hilft dir weiter.
Human are Human to make mistakes.