Frage zu COM Objekten



  • Hallo,

    wie in einem anderen Thread von mir zu lesen, entwickle ich mein erstes COM Objekt.

    Liege ich hiermit richtig:

    Wenn ich ein COM Objekt erstellt habe, muss das erstmal im System registriert werden, damit ich das zum Beispiel per Visual Basic ansteuern kann.
    Richtig?

    Zum Registrieren gibt es 2 Möglichkeiten:
    Einmal die "Self-registration", die aufgerufen wird, wenn ich das COM Objekt zum Beispiel in VBA bei den ganzen Steuerelementen versuche einzubinden?
    Hierzu muss ich vermutlich meinem COM Objekt eine Funktion geben. Weiß jemand wie die genauer auszusehen hat?

    Die andere Möglichkeit wird sein, das COM Objekt über eine andere externe Anwendung zu registrieren, oder?
    Weiß jemand wie die Anwendung in etwa auszusehen hat?

    Bin euch für eure Hilfe wirklich sehr dankbar. Muss möglichst schnell gehen, und finde einfach zu wenig Docs zu dem Thema 😕

    Danke,
    Gruß,
    Kevin



  • Hi.

    Surkevin schrieb:

    Liege ich hiermit richtig:

    Wenn ich ein COM Objekt erstellt habe, muss das erstmal im System registriert werden, damit ich das zum Beispiel per Visual Basic ansteuern kann.
    Richtig?

    Ja. Richtig.

    Zum Registrieren gibt es 2 Möglichkeiten:
    Einmal die "Self-registration", die aufgerufen wird, wenn ich das COM Objekt zum Beispiel in VBA bei den ganzen Steuerelementen versuche einzubinden?
    Hierzu muss ich vermutlich meinem COM Objekt eine Funktion geben. Weiß jemand wie die genauer auszusehen hat?

    Ich nicht, aber wenn man ein wenig googelt findet man ganz viel zu dem thema registrierung von COM-Assemblies.

    Die andere Möglichkeit wird sein, das COM Objekt über eine andere externe Anwendung zu registrieren, oder?
    Weiß jemand wie die Anwendung in etwa auszusehen hat?

    Im .NET-Framework gibt es ein Tool namens regasm.exe. Guckst du hier: http://msdn2.microsoft.com/de-de/library/tzat5yw6.aspx



  • Danke für die Antwort 🙂

    Regasm funktioniert leider nicht mit COMs die per VS2005 erstellt wurden... damn.. 😞

    Im Internet finde ich rein gar nichts brauchesbares zur Registrierung.

    Das einzige was bisher funktioniert hat, war, als ich ein C++ Projekt erstellt habe, die COM Dll #importiert habe und dann einen Zeiger drauf erstellt habe....dann wurde das Ding automatisch registriert...aber das muss doch auch anders gehen 😞

    Danke euch nochmal,

    ich hoffe ihr helf mir nochmal weiter 🙂

    Gruß,
    Kevin



  • Hallo,

    so hab mich jetzt nochmal informiert.

    Meine Anwendung die mein COM Objekt registriert kann erstellt praktisch alle nötigen Registryeinträge um das Teil zu registrieren.

    Selbige Registryeinträge sollten wohl auch in der DllRegisterServer erstellt werden.

    Weiß jemand wo ich ein Musterbeispiel von diesen Registryeinträgen finde?

    Ich habe zwar gültige gefunden. Ich weiß wo ich überall in der Registry welche erstellen muss, jedoch gibt es einen Wert, genannt "Assembly", welcher im Schlüssel CLSID/MyGUID erstellt werden muss, damit das Teil erkannt wird.

    Den zugehörigen Wert habe ich aus der Registrierung ausgelesen, welche meine C++ anwendung vorgenommen hat.

    In diesem AssemblyString kommt ein Paramenter "PublicKeyToken" vorher, ich hab aber keine Ahnung wie ich an diesen Wert selbst aus meiner COM-C#-Lib komme.

    Wisst ihr das? Oder habt ihr ein gültiges Beispiel für solch eine Registrierung von COM Objekten in der Registry? (hab ja leider nur meine vorgefertige Kopie von der automatischen Registrierung meiner C++-Anwendung...ist halt nich so das gelbe vom Ei 🙂 )

    Vielen Dank,
    Gruß,
    Kevin



  • Hab jetzt hier in der Schule nochmal nachgesehen.

    Der Assemblystring in der Registry sieht in etwa so aus:

    "DisplayName = Reflector, Version=3.2.5.0, Culture=neutral, PublicKeyToken=18ca6bb8dd6a03c3"

    bin in C# leider noch nicht so fit...wie komme ich an diesen String, wenn ich in meinem C# Code bin?

    this->GetAssemblyString() 😉

    Danke für die Antwort,
    Gruß,
    Kevin



  • Ich kenne mich mit COM nicht aus, sondern weiß nur, was das prinzipiell sein soll. Mit .NET ist aber meines Wissens die "COM-Technologie" veraltet. .NET-Programme haben ja u.a. auch den Vorteil, daß man leichter Anwendungen weitergeben kann, ohne eben dieses Registrierungs- und Versionierungsproblem-Gedöns...

    Mit der Registrierung bin ich überfragt. Im MSDN hab ich aber folgendes Stichwort gefunden, welches Dir weiterhelfen könnte:

    COM-Interop, COM-Interop ohne Registrierung

    .NET Framework-Entwicklerhandbuch

    COM-Interop ohne Registrierung aktiviert eine Komponente, ohne die Windows-Registrierung zum Speichern von Assemblyinformationen zu verwenden. Anstatt eine Komponente während der Entwicklung auf einem Computer zu registrieren, erstellen Sie zur Entwurfszeit Win32-Manifestdateien, die Informationen über Bindung und Aktivierung enthalten. Diese Manifestdateien steuern anstelle der Registrierungsschlüssel die Aktivierung eines Objekts.

    Die Aktivierung der Assemblies ohne Registrierung anstelle der Registrierung beim Entwurf bietet zwei Vorteile:

    Sie können steuern, welche DLL-Version aktiviert wird, wenn mehrere Versionen auf einem Computer installiert sind.
    Endbenutzer können mit XCOPY oder FTP die Anwendung in ein gewünschtes Verzeichnis auf dem Computer kopieren. Die Anwendung kann dann von diesem Verzeichnis aus ausgeführt werden.
    In diesem Abschnitt werden die beiden Arten von Manifesten beschrieben, die für COM-Interop ohne Registrierung erforderlich sind: Anwendungs- und Komponentenmanifeste. Diese Manifeste sind XML-Dateien. Ein Anwendungsmanifest wird durch einen Anwendungsentwickler erstellt und enthält Metadaten zur Beschreibung von Assemblies und Assemblyabhängigkeiten. Ein Komponentenmanifest wird von einem Komponentenentwickler erstellt und enthält Informationen, die andernfalls in der Windows-Registrierung enthalten sind........



  • Danke für die Hilfe!

    Aber ich muss oldschool bleiben 😉

    Trotzdem vielen Dank für die Mühe!

    Muss nur rausfinden wie ich an diesen Assemblystring komme....

    naja früher oder später hätte ich mich mit C# auseinandersetzen müssen 😉

    Viele Grüße,
    Kevin


Anmelden zum Antworten