Einzelnen Beitrag anzeigen

Benutzerbild von DirkG
DirkG

Registriert seit: 29. Sep 2003
Ort: Schwerin
67 Beiträge
 
Delphi 5 Enterprise
 
#10

Re: DLL + DataModule in Objektinspektor

  Alt 25. Apr 2006, 08:41
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.
  Mit Zitat antworten Zitat