Einzelnen Beitrag anzeigen

Benutzerbild von DirkG
DirkG

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

Re: DLL + DataModule in Objektinspektor

  Alt 31. Jan 2006, 18:27
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.
  Mit Zitat antworten Zitat