COM .dll registrieren

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    COM .dll registrieren

    Hi zusammen,

    kennt jemand von euch einen Weg wie ich eine COM .dll registrieren kann? Und wie ich überprüfe ob sie bereits registriert ist?

    Ich habe folgendes Problem, ich benutze in meinem Projekt die Microsoft.Ink.dll. Auf dem Entwicklungsrechner ist die Tablet.sdk installiert und meine Anwendung läuft ohne Probleme.
    Will ich die Anwendung auf dem Zielrechner laufen lassen, bekomm ich immer eine Fehlermeldung, das die .dll nicht registriert ist.

    Könnt Ihr mir helfen?

    Viele Grüße
    Hallo Demmy,

    versuchs mal hier.
    Beachte den Unterschied 32/64 Bit - ist aber unten beschrieben.

    Mandy
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:

    demmy schrieb:

    Aber wie kann ich so prüfen ob die .dll bereits registriert ist?
    Indem Du versuchst, Deine COM-Klasse zu instanziieren.
    Schlägt das fehl, ist sie nicht registriert.
    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!

    RodFromGermany schrieb:

    Indem Du versuchst, Deine COM-Klasse zu instanziieren.
    Schlägt das fehl, ist sie nicht registriert.

    Leider nicht ganz richtig. Die COM-Komponente kann durchaus korrekt registriert sein, aber wenn die enthaltende DLL selbst wiederum von anderen DLLs abhängig ist, die seit der Registrierung verschwunden sind (deinstalliert, gelöscht) oder durch nicht binärkompatible neuere Versionen ersetzt wurden (darf eigentlich nie vorkommen, aber manche Programmierer halten das mit den Interface-IDs nicht so genau, und dann rächt es sich), dann kann ebenfalls keine Instanz erzeugt werden.
    Kommt am Ende vermutlich aufs selbe hinaus, also: "keine Instanzierung -> COM-Komponente nicht verwendbar". Aber als Ursache einfach zu sagen "ist nicht registriert" kann den Benutzer - also den, der die Fehlermeldung lesen muss - auf die falsche Fährte führen. Hat mich früher schon so manches Mal viel Zeit gekostet...
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Arby schrieb:

    auf die falsche Fährte führen.
    Bei Fehler Neuinstallation. Feddich.
    Die Aussage: COM-Komponente ist registriert, ohne eine Aussage über Sekundärkomponenten zu machen halte ich für wenig hilfreich.
    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!
    Also um nochmal aufs Thema zurück zu kommen.

    Ich bekomme folgende Fehlermeldung: "Retrieving the COM class factory for component with CLSID {9FD4E808-F6E6-98D3-AA39054C1255} failed due to the following error 80040154 Klasse nicht registriert (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))"

    Irgendwie funktioniert nichts was ich versuche.

    Wenn ich die Registry durchgehe und mir alle Schlüssel der registriereten .dlls anschaue, woher weiß ich welche CLSID die ist, die ich benötige?
    Und wie muss die .dll richtig in die registry eingetragen werden?

    demmy schrieb:

    welche CLSID
    ist völlig egal, Du musst die entsprechende Komponente mit ihrem Namen erstellen. Die ID wäre dann z.B. eine Unterscheidung der Version, wie z.B. bei Excel & Co.
    Such mal nach COM komponente einbinden oder so was.
    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!
    ich habe jetzt mal versucht die dll mit folgendem Aufruf zu registrieren, "regsvr32 C:\Test\Microsoft.Ink.dll".
    Dann bekomme ich folgende Fehlermeldung: "Microsoft.Ink.dll wurde geladen, aber der DllRegisterServer-Eingangspunkt wurde nicht gefunden. Diese Datei kann nicht registriert werden."

    Wie kann denn das nun sein? das wiederspricht sich doch?
    Ist die Microsoft.Ink.dll eine .net dll?

    Registrieren kannst du nur ActiveX/COM dlls.

    Bei .net ist keine Registrierung notwendig, die muss im GAC oder bei deiner .exe liegen.
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:
    @demmy:: Meinst Du diese hier:

    Die kannst Du direkt als COM-Komponente Deinem Projekt als Verweis hinzufügen.
    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 gibt auch .NET-DLLs mit COM-Schnittstelle, und bei denen muss die COM-Schnittstelle genauso registriert sein wie bei allen anderen ActiveX/COM-Komponenten auch.
    Der Unterschied ist, dass im Gegensatz zu einer Nicht-.Net-DLL, die eben so Einsprungpunkte wie "DllSelfRegister()" und Co. hat, eine .NET-Dll keine solche exportierten Methoden besitzt, weshalb die COM-Registrierung über RegSvr32.exe nicht funktioniert.
    COM-Dlls, die in .NET programmiert wurden, werden daher stattdessen mit dem Tool RegAsm.exe registriert, das in den Pfaden der unterschiedlichen Frameworks von Microsoft bereitgestellt wird. In der Regel sollte das im 2.0er-Framework reichen. Auf einem 64-Bit-Windows muss man dann noch unterscheiden: Ist es eine 64-Bit- oder AnyCPU-Dll, wird sie mit der 64-bit-RegAsm.exe registriert. Ansonsten nimmt man die 32-bit-Version davon.

    Bei Microsoft.Ink.Dll wage ich aber zu bezweifeln dass das überhaupt notwendig sein sollte. Wenn die nicht geladen werden kann, dann ist irgendwas anderes an deinem System nicht in Ordnung, dann bringt auch ein Re-Registrieren nichts (und das ist das was ich oben meinte, lieber Rod! Die Anwort "ist nicht registriert" impliziert, dass ein Re-Registrieren ausreichen würde - und wird in den meisten Fällen nicht funktionieren, weil etwas ganz anderes der Grund für das Problem ist.)
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Ok, und wenn also nicht die .dll selber das Problem ist, wie bekomme ich nun raus was das Problem ist?

    Ich verwende nur das .net framework 4. ich möchte auch kein anderes verwenden, da die Anwendung auf Windows XP und Windows 7 laufen soll.

    Ich habe die Anwendung jetzt mal noch auf 2 anderen Rechnern getestet, auf denen läuft sie ohne Probleme, ohne das ich die .dll registrieren muss.

    demmy schrieb:

    ohne das ich die .dll registrieren muss.
    Handelt es sich bei dieser DLL tatsächlich um eine COM-DLL?
    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!
    Wie kann ich das denn rausfinden?

    Wie gesagt, ich bekomme folgende Fehlermeldung in Vb.net: "Retrieving the COM class factory for component with CLSID {9FD4E808-F6E6-98D3-AA39054C1255} failed due to the following error 80040154 Klasse nicht registriert (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))"

    darauß schließe ich, das es sich um eine COM.dll handelt.

    demmy schrieb:

    folgende Fehlermeldung
    Wie rufst Du denn das auf?
    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!
    Naja indem ich die Anwendung starte und sobald ich etwas ausführe wobei diese .dll benötigt wird, wird diese exception ausgelöst.
    Auf dem Zielrechner ist nur das .net framework installiert und keine Entwicklungsumgebung!!!! Ich lasse mir die Fehlermeldung dann über eine Messagebox ausgeben.

    Was ich halt auch komisch finde, die .dll ist als lokale Kopie im Applikationsverzeichnis hinterlegt. Wieso reicht das denn nicht aus? bei anderen .dlls genügt dies doch auch???

    demmy schrieb:

    über eine Messagebox ausgeben.
    Lass Dir den StackTrace mit ausgeben, dann weißt Du wenigstens, in welcher Codezeile das aufgetreten ist.
    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!
    Also allein die Namensgebung "Microsoft.Ink.dll" lässt darauf schließen, dass es sich hier gar nicht um eine COM-Komponente handelt sondern vielmehr um eine .NET-Assembly, die zudem nicht auf jedem Windows-PC installiert ist, sondern laut microsoft.com/en-us/download/details.aspx?id=22557 und/oder support.microsoft.com/kb/900722 für Windows XP Tablet PCs vorgesehen ist.
    Mit Visual Studio wird offensichtlich eine "Referenzassembly" davon unter [ProgramFiles]\Reference Assemblies\Microsoft\Tablet PC\v6.0\Microsoft.ink.dll installiert, keine Ahnung, ob die "funktionsfähig" ist oder wirklich nur als Referenz dient, um auf Desktop-PCs Software für WinXP Tablet PCs entwickeln zu können.

    Wenn deine Software nicht ausschließlich für Tablets gedacht ist, würde ich eher dazu raten, von der Verwendung dieser Bibliothek Abstand zu nehmen. Wenn es sich bei den "anderen Geräten auf denen es läuft" aber ebenfalls um Desktop-PCs handeln sollte, liegt die Vermutung nahe, dass auf deinem System irgendwas "kaputt" gegangen ist. Dann wäre mein Rat, die Visual Studio Installation zu reparieren bzw. das Visual Studio im Zweifel komplett neu zu installieren.

    Um COM handelt es sich hier jedenfalls mit hoher Wahrscheinlichkeit nicht.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.