Laden...

VB6 Singleton

Erstellt von norman_timo vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.416 Views
norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 16 Jahren
VB6 Singleton

Hallo zusammen,

ich habe schon gegooglet (<- Oh my god, what a construction!), und tonnenweise Informationen gefunden.

Mein Problem ist, dass ich hier bestimmt 1000 verschiedene Beispiele gefunden hab, jedoch keines irgendwie zum Laufen gebracht hab, oder den Sinn nicht so verstanden hab.

Deshalb meine Frage, hat jemand ein schlüssiges Beispiel oder einen Link zu einer guten Umsetzung von einem VB6 Singleton? (Bitte hier keine Google ergebnisse einfügen, sondern nur Links, die selbst mal verifiziert worden sind).

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

3.971 Beiträge seit 2006
vor 16 Jahren

Also bei COM-Objekten würd ich es zum Beispiel so machen:



public class MyCOMObj : ICOMObj
{
  private class Singleton
  {
    static readonly Singleton instance = new Singleton();
    
    private Singleton();

    public void SingletonFunc()
    {
      ...
    }
  }

  void ICOMObj.DoSomeThing()
  {
    Singleton.instance.SingletonFunc();
  }
}

Hab ich allerdings im Bezug auf COM-Anwendungen noch nicht getestet.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 16 Jahren

Hallo kleines_eichhoernchen,

genau um selbst gestrikte COM Klassen geht es, allerdings folgendes ist definitiv ein Problem:


private Singleton();

Aus VS heraus lassen sich sehr bequem COM-Objekte über die Vorlagen generieren, und dort steht eindeutig (und das glaube ich mal blind 🤔 ):


    // Eine erstellbare COM-Klasse muss eine Public Sub New() 
    // ohne Parameter aufweisen. Andernfalls wird die Klasse 
    // nicht in der COM-Registrierung registriert und kann nicht 
    // über CreateObject erstellt werden.
    Public MyClass() : base()
    {
    }

Problem hierbei wird sein, dass "CreateObject()" sonst immer regelrecht ins Leere greift (vermute ich mal).

Grüße
Norman-Timo

Edit: Tippfehler im Code

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

3.971 Beiträge seit 2006
vor 16 Jahren

Ich hab leider die Vorlagen nicht, aber Designtechnisch kannst du doch in deine COM-Klasse (auch vom Assistenten erstellt), dir so eine Nestet-Klasse einbauen, und diese dann wie oben beschrieben einbinden.

Mit einer COM-Klasse kannst du ja auch auf andere Ressourcen(Klassen) innerhalb deiner C#-Anwendung zugreifen.

Oder willst du mit VB6 eine Singleinstance-Klasse erstellen?

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 16 Jahren

Hallo

Oder willst du mit VB6 eine Singleinstance-Klasse erstellen?

Primär würde ich Singletons in VB6 erstellen wollen, um die von mir angebotenen COM Klassen zu verwenden. Aber grundsätzlich ist in VB6 schon ein Objektorientierter Ansatz vorhanden, und ich will auch VB6 intern gerne so etwas wie Singletons verwenden.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

1.274 Beiträge seit 2005
vor 16 Jahren

Primär würde ich Singletons in VB6 erstellen wollen, um die von mir angebotenen COM Klassen zu verwenden.

Geht relativ einfach, hier mal ein bisschen VB6 Code


'Modul
private g_objCOM as object

'Factory Klasse dafür
Function FactoryGetComObject() as object
if g_objCOM is nothing
   set objCom = CreateObject(...)
end if

set FactoryGetComObject =  g_objCOM

end function

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 16 Jahren

Hallo LastGentleman,

das ist sehr simpel, danke. Da ist das Problem, dass es keine Singeltons "by design" sind, sondern Singleton "by contract".

Soll heißen, dass halt jeder, der das Objekt benötigt über diese Factory gehen muss um das Singleton zu garantieren.

Analog kann ich das natürlich auch mit den VB6-Klassen machen, das wäre kein Problem.

Ich glaub ich komme langsam zur Erkenntnis, dass es einfach nicht anders geht. Es gibt kein Singleton "by Design" in VB6. Für die COM-Klassen kann ich intern einen Wrapper bauen, der immer mit einem "echten" Singleton arbeitet, dann können von mir aus auch 1000 COM Instanzen des Wrappers gebildet werden.

Aber für VB6 interne Klassen sehe ich keine Möglichkeit, leider.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

1.274 Beiträge seit 2005
vor 16 Jahren

Hallo Norman_Timo,

deine Aussage verstehe ich nicht ganz

dass es keine Singeltons "by design" sind, sondern Singleton "by contract".

Aber für VB6 interne Klassen sehe ich keine Möglichkeit, leider.

das ist doch genau gleich, nur das statt CreateObject -> new myClass kommt.

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 16 Jahren

Hallo LastGentleman,

"by contract" bedeutet, dass jeder Software-Entwickler an dem Projekt sich dran halten muss. Denn man kann die bestimmten Klassen nach wie vor neu erzeugen, anstatt über das Modul und der Factory-Methode zu gehen. Außerdem müssen alle Entwickler wissen, dass es solch eine FactoryMethode gibt.

"by design" würde bedeuten, dass Entwickler gar nicht in der Lage sind neue Instanzen zu bilden. In C# würde man bei einem Singleton den Konstruktor privat machen, das geht aber mit VB6 nicht, und genau das ist das Problem.

Wenn man alleine an einem Projekt arbeitet, dann bräuchte man theoretisch noch nicht einmal Singletons, weil man selbst drauf achten könnte, wie oft man eine Instanz erzeugt...

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

1.274 Beiträge seit 2005
vor 16 Jahren

Ah,

ich befürchte das geht nicht, du kannst dich mal ein bisschen mit den Attributen im Dateiheader spielen, vielleicht findest du was.

lg
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein