Benutzer mit den meisten Antworten
Eigene COM-Klasse erstellen, registrieren, benutzen

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
Antworten
-
Also wir registrieren nur mittels
regasm ourcomobject.dll /codebase
und deregestrieren mittels
regasm ourcomobject.dll /unregisterSignieren 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
Alle Antworten
-
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
-
Also wir registrieren nur mittels
regasm ourcomobject.dll /codebase
und deregestrieren mittels
regasm ourcomobject.dll /unregisterSignieren 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
-
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
-
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
-
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/ -
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