AGB  ·  Datenschutz  ·  Impressum  







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

Dll und Variablen-Scope

Ein Thema von Sämy · begonnen am 29. Nov 2007 · letzter Beitrag vom 29. Nov 2007
Antwort Antwort
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#1

Dll und Variablen-Scope

  Alt 29. Nov 2007, 10:49
Hallo

Ich habe eine Klasse, die ich als Singleton(nur eine Instanz) definiere:
Delphi-Quellcode:
type
  TPluginManager = class
  public
    class function getInstance: TPluginManager;
  end;

var
  instance: TPluginManager;

implementation

class function TPluginManager.getInstance: TPluginManager;
begin
  if not Assigned(instance) then
    instance := TPluginManager.Create;
  Result := instance;
end;
Wenn ich nun also TPluginManager.getInstance aufrufe, so bekomme ich dessen Instanz zurück.
Ich arbeite jedoch mit Dll's und wenn ich von dort aus TPluginManager.getInstance aufrufe, erhalte ich nicht mehr die in der Applikation erzeugte Instanz, sondern eine neue wird erstellt.
Wie kann ich dieses Problem umgehen?

Besten Dank!
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Dll und Variablen-Scope

  Alt 29. Nov 2007, 11:01
Zitat von Sämy:
Ich habe eine Klasse, die ich als Singleton(nur eine Instanz) definiere:
Wo deklarierst Du die Klasse als singleton?
Kann das Delphi überhaupt?

In der DLL hast Du vermutlich einen anderen Scope, da ist die erste Instanz nicht bekannt.
Vermutlich müsstest Du sie an die DLL übergeben.

Korrgiert mich bitte, wenn ich Müll geschrieben habe.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Dll und Variablen-Scope

  Alt 29. Nov 2007, 11:04
Du hast also in deinem Programm und in der DLL eine globale Variable Instance? Und demnach hast du dann zweimal ein Objekt deiner Klasse.
Sehe ich das so richtig?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Dll und Variablen-Scope

  Alt 29. Nov 2007, 11:19
Zitat:
Wo deklarierst Du die Klasse als singleton?
Kann das Delphi überhaupt?
Ich "deklariere" die Klasse als Singleton. Ich definiere einfach die getInstance-Funktion ein um die Singleton-Implementation zu erreichen.


Ich habe diese Klasse in einer eigenen Unit und diese binde ich in der Applikation, wie auch in der Dll ein.
Anschliessend erhalte in der Applikation, wie auch in der Dll (respk. jeder Dll, bei mehreren), eine eigene Instanz, obwohl ich gerne nur eine hätte.

Eine Übergabe der Variable kann ich leider nicht realisieren, da ich viele solche Singleton-Klassen habe und ich nicht weiss, welche alle in der Dll gebraucht werden. Respk. ich will nicht, wenn ich eine neue Singleton-Klasse erstelle, die Dll-Funktion ändern müssen...
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Dll und Variablen-Scope

  Alt 29. Nov 2007, 11:24
Durch die Unit, welche nur identisch in DLL und EXE, erreichst du ja nur, dass der Code identisch in beiden Programmen ist. Dadurch existiert die goabel Variable eben auch zweimal.
Das Problem könnte man über eine MMF lösen. Allerdings besteht dann ein weiteres Problem darin, das du ohne Sharemem nicht kreuz und quer Klassen zwischen DLL und EXE austauschen kannst.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Dll und Variablen-Scope

  Alt 29. Nov 2007, 11:35
Zitat von sirius:
Durch die Unit, welche nur identisch in DLL und EXE, erreichst du ja nur, dass der Code identisch in beiden Programmen ist. Dadurch existiert die goabel Variable eben auch zweimal.
Dies ist mir schon klar.


Da ich ShareMem sowieso schon verwende, wäre der zweite Ansatz interessant. Wie könnte ich dies realisieren?
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Dll und Variablen-Scope

  Alt 29. Nov 2007, 12:15
Vielleicht so:
Delphi-Quellcode:
type
  PPlugInManager = ^TPluginManager;
  TPluginManager = class
  public
    class function getInstance: TPluginManager;
  end;


const InstanceName='HalloIchMUSSAufDemRechnerGanzEinamligSein';
var InstanceMMF:THandle=0;

implementation

uses windows, sysutils;

class function TPluginManager.getInstance: TPluginManager;
var Instance:PPluginManager;
    InstanceExists:boolean;
    vInstanceName:string;
begin
  if InstanceMMF=0 then
  begin
    vInstanceName:=InstanceName+inttohex(getcurrentprocessid,8);
    InstanceMMF:=createfilemapping(cardinal(-1),nil,PAge_ReadWrite,0,4,Pchar(vInstanceName));
    InstanceExists:=getlasterror=ERROR_ALREADY_EXISTS;
  end
  else
    InstanceExists:=true;
  Instance:=mapviewoffile(InstanceMMF,FILE_MAP_ALL_ACCESS,0,0,0);
  try
    if InstanceExists then
      result:=Instance^
    else
    begin
      result:=TPluginManager.Create;
      Instance^:=result;
    end;
  finally
    unmapviewoffile(Instance);
  end;
end;

//irgendwann sollte auch mal closehandle(InstanceMMF) aufgerufen werden. Und das in jeder DLL und Exe.
// vielleicht in einer speziellen Free-Methode (du musst ja auch irgendwann Free bzw. Destroy aufrufen)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Dll und Variablen-Scope

  Alt 29. Nov 2007, 12:27
Besten Dank für die Unterstützung!

Es funktioniert.
Gruss Sämy
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz