CreateObject Einzelinstanz

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    CreateObject Einzelinstanz

    Hi,
    ich habe folgendes Problem:

    was ich gemacht habe:
    1: Ich habe 2 Windows Form-Anwendungen erstellt. Eins für COM sichtbar gemacht und registriert.
    Unter Project-Eigenschaften habe ich auch "Einzelinstanzanwendung" ausgewählt.

    2: Mein zweites Programm erstellt ein Object von Programm 1.

    Public Test_Object As Object
    Test_Object = CreateObject("creatob.Form1", "")



    Das alles funktioniert auch wunderbar.
    Ich will damit erreichen: Parameter oder Werte aus dem ersten Programm auszulesen.

    DAS PROBLEM:
    Es wird ein neues Object erzeugt... damit bekomme ich werte aus dem object welches ich neu erzeugt habe..

    Was mache ich falsch !?

    zusatz:
    Das habe ich sogar auf Microsoft-Seite gefunden:

    Wenn sich ein Objekt als Einzelinstanzobjekt registriert hat, wird nur eine einzige Instanz dieses Objekts erstellt, unabhängig davon, wie oft CreateObject ausgeführt wird.

    ich weiss nicht warum bei mir immer ein neues object erzeugt wird!? ?(
    Dein Problem ist leider nicht verständlich.
    Deine Formulierung ist etwa so:
    Ich will Auto fahren, wenn ich es starte, ist es an.
    Was mache ich falsch?
    Mach mal eine Pause und lies dann Deinen Beitrag noch mal durch und überlege, was Du eigentlich sagen willst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es ist ein wenig unverständlich was du meinst.
    Aber, läuft denn deine COM Applikation schon, bevor du Sie mit CreateObject versuchst zu erzeugen ?
    Was genau geschieht denn ?
    Entsteht wirklich eine 2. Instanz? ( Dann ist die Einzelinstanzregistrierung nicht iO) oder wird die eine Instanz einfach neu instanziert ?
    Wenn 2. der Fall ist, versuche die Referenz auf das COM Objekt erst mit GetObject zu erhalten, wenn dies nicht geht, erzeuge eine Instanz mit CreateObject.

    Ich hoffe ich habe dich richtig verstanden..

    Gruss Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Einzelinstanzobjekt (COM) != Einzelinstanzanwendung (.NET)! Es kann sein, dass die CLR bei gesetzter Option entsprechend handelt, aber da bin ich mir nicht sicher. Wenn du ein Singleton-Objekt in .NET erstellen willst, das auch noch für COM verfügbar ist, bedeutet das (geschätzt) eine Menge Aufwand. Je nachdem, wie gut du mit COM vertraut bist, wird es für dich eher einfach oder eben nicht.

    Übrigens ist es lt. MSDN nicht möglich, von .NET über COM-Interop auf eine andere .NET-Anwendung zuzugreifen (mir fehlt grade der genaue Link, aber es steht irgendwo hier). Dafür solltest du die von .NET bereitgestellten Techniken wie Remoting oder WCF verwenden.
    Gruß
    hal2000
    Ok sorry ich versuche nochmal zu erklären:

    1 - Ich erstelle 2 verschiedene Anwendungen.

    -------------------
    Anwendung 1:


    Hier habe ich die Anwendung as "Einzelinstanzanwendung" erstellt.
    und eine bestimmte Classe "ClassFrei" für COM frei gegeben, so:
    -Com-Klass = True
    -Com-sichtbar = True

    Die anwendung habe ich mit ein Setup installiert und habe in Setup eingegeben dass die Anwendung in Com registriert werden soll.
    -------------------

    Anwendung 2:

    beinhaltet das hier:

    Dim Obt as Object
    Obt = GetObject("", "Anwendung1.ClassFrei")

    Obt.FunktionXY()

    -------------------


    Die Kommunikation dazwischen funktioniert auch wunderbar..
    Das bedeutet dass ich alle Public Functionen und Variablen in Anwendung1 in ClassFrei aus Anwendung2 ansprechen kann.



    Das Problem:
    Das GetObject müsste eigentlich eine Instanz auf das schon gestartete Anwendung1 setzen/erzeugen, was nicht passiert..
    Es wird ein neues Object erzeugt.. ?(
    Mal sehen, ob ich Dich richtig verstanden habe.
    Du hast einen COM-Server und einen COM-Client.
    Du startest den COM-Server und danach den COM-Client.
    Der COM-Client baut eine Verbindung zum COM-Server auf.
    Du hast 2 COM-Server-Instanzen.

    Wenn das so ist:
    Lass mal den Server als Einzelinstanzanwendung laufen:
    Projekt -> Eigenschaften -> Anwendung
    Haken bei Einzelinstanzanwendung erstellen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Rod: Hat er schon versucht, siehe 1. Post.

    @peyman:
    Schau dir folgenden Link an - so kannst du feststellen, ob du wirklich verschiedene Objekte erstellst:
    omniscientist.net/outlookinteropinstanceequivalence

    Wenn du ein Singleton (so werden Einzelinstanz-Klassen genannt) erstellen willst, brauchst du eine Wrapper-Klasse, d.h. eine Art Class Factory. In einem anderen Forum wurde diese Frage schonmal gestellt und gelöst, daher verweise ich mal darauf; (letzter Post):
    forums.devshed.com/net-develop…h-com-interop-542374.html

    Du solltest dir auch das "Interop Forms Toolkit" ansehen - der generierte Code ist eventuell aufschlussreich.

    Edit: Hier steht alles nochmal kurz zusammengefasst:
    bbs.prog365.com/.net-developme…om-interop-15032-2-1.html
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()

    Hallo Leute,

    ich suche leider immer noch nach einer Lösung...

    Ich habe mehrere Anwendungen gesehen (Wie z.B Word und Excel und auch andere nicht von Microsoft erstellte Anwendungen) die man über GetObject-Function ansprechen kann.

    mir ist aufgefallen dass diese all so anzusprechen sind: GetObject ("" , "Word.Application") oder GetObject ("" , "Beispielanwendung.Application")

    Also die Classe heisst immer Application.. hat das irgendwie damit was zutun??
    Ist das vielleich keine Classe ?? so das GetObject über das gesamte Anwendung gesetzt wird und nicht nur die classe??

    Danke,.

    peyman schrieb:

    Also die Classe heisst immer Application.. hat das irgendwie damit was zutun??

    Nein.

    GetObject() in VB6 bzw. Marshal.GetActiveObject() liefern eine ("die") Instanz zurück, die sie aus der RunningObjectTable (ROT) abrufen. Wenn du unbedingt GetActiveObject() verwenden willst, musst du dein Objekt dort registrieren. Siehe dazu: msdn.microsoft.com/en-us/library/ms680747%28v=vs.85%29.aspx.

    Beachte aber unbedingt: Es ist lt. MSDN nicht möglich, von .NET über COM-Interop auf andere .NET-Anwendungen zuzugreifen. Dafür solltest du die von .NET bereitgestellten Techniken wie Remoting oder WCF verwenden.
    Gruß
    hal2000