none
Eigene COM-Klasse erstellen, registrieren, benutzen RRS feed

  • Frage

  • Hallo zusammen,

     

    Ich würde gerne meine eigene COM-Klasse schreiben. Hier eine Anleitung.
    Arbeite mit VB Express 2010, weshalb ich keine COM-Klassenvorlage und auch die Option "Für COM-Interop registrieren" nicht zur Verfügung habe.

    Was ich bisher gemacht habe:

    <ComClass(My1stCOMClass.ClassId, My1stCOMClass.InterfaceId, My1stCOMClass.EventsId)>
    Public Class My1stCOMClass
    
    #Region "COM-GUIDs"
        Public Const ClassId As String = "66534799-d4d0-47cb-b7f1-da4f07a0b289"
        Public Const InterfaceId As String = "1c529817-fee7-4f91-b05c-700477810380"
        Public Const EventsId As String = "ccb010f8-f288-4cc2-92c9-3ef386d85de8"
    #End Region
    
    
        Public Sub New()
            MyBase.New()
        End Sub
    
        Public Function HelloCOM() As Integer
    
            MsgBox("Hello World")
    
            Return 1
        End Function
    
    End Class
    

    Ausserdem habe ich das .dll File "MyFirstCOMObject.dll" aus dem Ordner "\MyFirstCOMObjet\MyFirstCOMObjet\bin\Debug" des Projektverzeichnisses mit dem Tool RegAsm.exe registriert. Dies kann man anscheinend alternativ zur Option "Für COM-Interop registrieren" machen. Die registration war auch erfolgreich.

    Allerdings ist es mir nicht möglich, auch die Klasse zuzugreifen. Weder in VB Express unter Verwiese noch mit VBscript.
    Hier mein VBscript Code:

    Dim comObj, tmp
    set comObj = CreateObject("myclasses.My1stCOMClass") 
    
    'bekomme eine Fehlermeldung dass die ActiveX-Komponente
    'das Objekt nicht erstellen kann
    



    Wie kann ich überprüfen, ob die Klasse korrekt registriert ist?
    Habe ich etwas vergessen?
    Habe ich die flasche .dll registriert? (Im Projektordner sind ja mehrere vorhanden)

    Viele Grüsse,
    kaktus

    Mittwoch, 23. November 2011 09:58

Antworten

  • Also wir registrieren nur mittels
    regasm ourcomobject.dll /codebase
    und deregestrieren mittels
    regasm ourcomobject.dll /unregister

    Signieren musst Du die DLL natürlich. Die Express Edition bietet das hoffentlich auch in der GUI, ansonsten muss man halt von Hand mittels sn.exe einen Key erzeugen und damit signieren.

    Der Fehler mit dem Element not found sagt mir erst einmal nichts. Hast DU evtl. noch mehr Infos?

    Konrad

     

    • Als Antwort markiert kaktusgruen Freitag, 25. November 2011 07:18
    Mittwoch, 23. November 2011 14:10

Alle Antworten

  • Hi,

    wie hast Du die Registrierung mit regasm gemacht? Inclusive /codebase switch?

    Konrad

    Mittwoch, 23. November 2011 13:20
  • Hallo Konrad,

    bin mittlerweile schon ein bischen weiter.

    Habe gemerkt, dass ich das Objekt über einen falschen Stammnamespace erstellen wollte.   -.-
    Richtig war ClassLibrary1.

    Allerdings bin ich jetzt am nächsten Problem.
    Ich habe die .dll folgendermasen registriert:

    RegAsm.exe Z:\MyFirstCOMObject.dll /tlb:MyFirtsCOMObject.tlb /codebase

    Dabei bekam ich eine Warnung für /codebase, dass ich die Asembly mit einem starken Namen registrieren soll,
    eine Meldung, dass die Typen registriert wurde,
    und ein Error, welcher folgendermasen aussieht:
    RegAsm : error RA0000 : Der Typbibliothekexporter hat beim verarbeiten von "ClassLibrary1.My1stCOMClass, MyFirstCOMObject" einen Fehler gefunden. Fehler: Element not found..

    Das Script hat dann aber trotz des Errors funktioniert!

    Allerdings kriege ich den Eintrag nun nicht mehr aus den Registry.

    Wie muss ich die .dll korrekt registreren und wie kann ich sie auch wieder entfernen?


    Vielen Dank für die Hilfe,
    kaktus


    • Bearbeitet kaktusgruen Mittwoch, 23. November 2011 14:06
    Mittwoch, 23. November 2011 14:01
  • Also wir registrieren nur mittels
    regasm ourcomobject.dll /codebase
    und deregestrieren mittels
    regasm ourcomobject.dll /unregister

    Signieren musst Du die DLL natürlich. Die Express Edition bietet das hoffentlich auch in der GUI, ansonsten muss man halt von Hand mittels sn.exe einen Key erzeugen und damit signieren.

    Der Fehler mit dem Element not found sagt mir erst einmal nichts. Hast DU evtl. noch mehr Infos?

    Konrad

     

    • Als Antwort markiert kaktusgruen Freitag, 25. November 2011 07:18
    Mittwoch, 23. November 2011 14:10
  • Die Express Edition bietet die Möglichkeit der Signierung an.

    Habe jetzt eine .snk Schlüsseldatei erstellt.
    Wie kann ich dies jetzt bei der Registrierung nutzen?
    Die Warnung kommt auf jeden Fall immer noch.

    Ein zweites Problem ist, dass ich die Klasse nicht mehr aus dem Assembycache bringe.

    Gruss


    • Bearbeitet kaktusgruen Mittwoch, 23. November 2011 14:34
    Mittwoch, 23. November 2011 14:30
  • Hi,

    Du nutzt die Datei nicht bei der Registrierung. Sondern Du nutzt beim Bauen Deiner Solution die snk Datei um deine Assemblies zu signieren.

    Also etwas billdlich gesprochen meckert RegAsm: "Da ist keine Unterschrift auf der DLL".

    Also musst Du einfach dafür sorgen, dass da eine Unterschrift auf die DLL kommt, ehe Du RegAsm aufrufst. (Und dies zeigt auch: Es wird keine Kontrolle der Unterschrift durchgeführt, also egal was für eine Unterschrift drauf ist: Es ist für regasm ok, solange überhaupt eine drauf ist. Dadurch wird der Datei nicht mehr vertraut oder so.)

    Mit den besten Grüßen,

    Konrad

    Mittwoch, 23. November 2011 14:52
  • Hat alles geklappt, vielen Dank.

    Grüsse kaktus

    Donnerstag, 24. November 2011 08:11
  • Hat alles geklappt, vielen Dank.

    Grüsse kaktus


    Dann markiere doch bitte den/die posts als Antwort, die Deine Frage beantwortet hat/haben.
    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    Donnerstag, 24. November 2011 09:33
  • Also bei mir klappt das auch, d.h. ich bekomme keinen Fehler; weder beim Kompilieren im VS 2012 VB Express, noch beim integriertem signieren, noch beim Regasm.

    Allerdings, sobald ich versuche aus VB Script mittels CreateObject auf das Objekt zuzugreifen, bekomnme ich einen Fehler 424 "Object not found".

    Wenn ich es aus einem VB-Modul probiere klappt es.

    Somit fürchte ich, dass die Reistrierung als COM ist nicht astrein ist, auch wenn ich divere Einträge in der Registry gefunden habe.

    Wenn ich mit der Powershell das Kommando

    Get-WMIObject Win32_ClassicCOMClassSetting | Where-Object { $_.Caption -eq "My1stCOMClass.My1stCOMClass" }

    absetze, wird mein Objekt auch nicht angeziegt.

    Was kann ich tun?


    • Bearbeitet RudiRatlos1 Dienstag, 28. August 2012 15:55
    Dienstag, 28. August 2012 15:52