AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL + DataModule in Objektinspektor

Ein Thema von sir-archimedes · begonnen am 16. Jan 2006 · letzter Beitrag vom 12. Jun 2006
 
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, 07: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz