Allgemeine COM-Frage



  • Hi Leute,

    hab mein dll-Problenm gelöst. So nun mal eine grundsätzliche Frage:

    Wenn ich mit CoCreateInstance ein Objekt meiner COM-Klasse erstelle und dies als Member in meiner App habe, d.h es bleibt so lange bestehen wie die App, und dann nochmal CoCreateInstance aufrufe in einem Dialog oder so. Bekomm ich dann einen Pointer auf das schon erstellte Objekt oder wird ein neues erzeugt?
    Das ist wichtig für mich und ich habe bis jetzt noch keine Antwort gefunden.

    Gruß,

    Stalin



  • Es hängt von der ClassFactory ab, aber normalerweise bekommst du bei jedem CoCreateInstance-Aufruf ein Zeiger auf ein neues Objekt.



  • Und wie kann ich es handeln das nur eins erstellt wird?
    Wie war das mit der Classfactory?
    Hab da keine Ahnung.



  • Stalin schrieb:

    Und wie kann ich es handeln das nur eins erstellt wird?

    Der einfach Weg: Nur einmal CoCreateInstance aufrufen, und den Zeiger über Smartpointer / AddRef / QueryInterface weitergeben. IMHO sollte man keinen Singleton erzeugen, nur weil man zu faul ist, einen vorhandenen Zeiger dahin zu bringen, wo er gebraucht wird.

    Falls es wirklich einen Grund gibt: Schau dir mal DECLARE_CLASSFACTORY_SINGLETON an.



  • Du solltest es nicht tun ... !

    CoCreateInstance sollte immer ein neues Object zurueckliefern !!!

    Com-Objecte sind BetriebssystemSpezifisch ... wie spezifisch soll dein Singelton sein ?
    ProzessSpezifisch, BetriebssystemSpezifisch ... Netzwerkspezifisch ???

    Warum sollte von deiner COM-Klasse nur 1. Instanz existieren ? Uch dass solltest du DIr ueberlegen.

    Wenn Du wirklich nen Singleton Brauchst, solltest das ned allein ueber die COM-Classe loesen.
    1. (eher schlechtere) Ansatzpunkt waere: CoCreate liefert dir nen Fehler zurueck, wenn schon ne Instanz existiert, nu weiss dein CLient, das er mit CoGetObject arbeiten sollte ...
    2. Schreib dir nen Handler ... der dir die CoCraete/CoGetClass Abrufe abnimmt .. und mit ner Get - Function nen Zeiger auf deine Singelton-Class Schnittstelle leifert.

    Schlecht ist definitiv folgendes Scenario (in basic, der einfachheithalber):

    set myVar1 = new IMyClass
    set myVar2 = new IMyClass
    
    myVar1.Color = vbred
    myVar2.Color = vgreen
    
    x = myVar1.Color
    

    Ist X nun vbred oder vbgreen ?
    Bei einer nichtersichtlichen SingeltonImplementation wuerde der User zumindest staunen. Der User sollte wissen, das nen Object nen Singelton ist und es dementsprechend auch anders erzeugen muessen !!!

    Ciao ...




Anmelden zum Antworten