Announcement

Collapse
No announcement yet.

COM-Server/Komponente in VB.NET einbinden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • COM-Server/Komponente in VB.NET einbinden

    Hallo,

    ich habe mich lange mit der Programmierung in VBA beschäftigt und verschiedene AddIns für unterschiedliche Office Anwendungen entwickelt, die über einen COM-Server eine Verbindung zu einem CRM-System hergestellen.

    Nun ist es so weit diese VBA AddIns durch ein in VB.NET geschriebenes ComAddIn abzulösen.

    Ich habe bereits ein ComAddIn erstellt, was auf die Office Applikationen zugreifen kann, als nächstes steht auf der Aufgabenliste die Implementierung des COM Servers in VB.NET

    Dies scheint sich jedoch schwieriger zu gestallten als ich angenommen habe, da ich immer wieder folgenden Fehler erhalte:

    Die COM-Klassenfactory für die Komponente mit CLSID {5AA85D7A-197B-4434-B4A0-6D4EFAB1B66B} konnte aufgrund des folgenden Fehlers nicht abgerufen werden: 80080005.



    Als Meldung im VB.NET Debug Fenster ist folgender Eintrag zu finden:

    Eine Ausnahme (erste Chance) des Typs "System.Runtime.InteropServices.COMException" ist in jayx_ComAddIn.dll aufgetreten.


    Die Fehlermeldung kommt beim erstellen der Objektinstanz.

    Hier der Beispiel-QC wie ich den COM-Server einbinde:
    Code:
    Code:
    Imports Microsoft.VisualBasic 
    Imports COM_jayxGM 
    
    Public Class Form1 
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
            Dim obj As COM_jayxGM.jayxGM 
    
            obj = New COM_jayxGM.jayxGM 
    
        End Sub 
    End Class

    Ich habe den COM-Server per Verweis hinzugefügt, falls dies eine Rolle spielen sollte.

    P.S.:
    Der COM Server ist mit einer sehr seltenen/alten Programmiersprache CTD (Centura Team Developer) entwickelt worden. Eine Umwandlung des QC's an sich ist daher sehr umständlich.


    Danke im vorraus

  • #2
    Hallo,

    ...Programmiersprache CTD (Centura Team Developer) ...
    es gab gute (technische) Gründe, warum die "Evolution" die Sprache SAL sowie die Entwicklungsumgebungen Gupta SQLWindows bzw. CTD auf das Abstellgleis geschoben hat ;-)

    Der von COM gelieferte HRESULT-Wert 80080005 entspricht in der Übersetzung (Winerror.h) dem Fehlertext "Starten des Servers fehlgeschlagen". Wenn der HRESULT-Wert einen Fehler kodiert, löst COM Interop von .NET automatisch eine Exception aus.

    Ich habe den COM-Server per Verweis hinzugefügt, falls dies eine Rolle spielen sollte
    Damit .NET auf ein "altes" Win32-COM-Objekt zugreifen kann, muss eine Interop Assembly (IA) eingebunden werden. Visual Studio legt die IA immer dann automatisch an, wenn das COM-Objekt als Verweis zum Projekt hinzugefügt wird. Dabei wird in der benötigten Sprache (VB oder C#) der Anpassungs-Quelltext maschinell generiert. Das Ergebnis ist jedoch nur dann brauchbar, wenn das COM-Objekt a) intern sauber arbeitet und b) seine Schnittstellen in der Typbibliothek korrekt benennt.

    Nicht bei jedem COM-Objekt kann eine zu 100% funktionierende IA automatisch generiert werden. Wenn dies der Fall ist, muss der Herausgeber des COM-Objekts eine von Hand angepasst PIA (Primary Interop Assembly) zusätzlich mit ausliefern. Wenn die PIA auf dem Entwicklungsrechner registriert wurde, tauscht Visual Studio beim Hinzufügen des Verweises automatisch die IA durch die PIA aus. Zum Beispiel funktionieren die Automation-Objekt von Microsoft Office nur mit den PIA's, aber nicht zu 100% mit den automatisch erstellten IA's.

    Lange Rede - kurzer Sinn: Wenn mit dem CTD ein COM-Objekt erstellt wurde, muss man sich über Reflector (oder ähnliche Tools) den Inhalt der automatisch erstellten IA genau ansehen. Beim Erzeugen der Objektinstanz muss man dann alle dort angebotenen Alternativen (Interfaces und Klassen) ausprobieren. Im Worst Case ist die IA unbrauchbar.

    Comment


    • #3
      Zunächsteinmal danke für die Antwort.

      Das was du da geschrieben hast kann ich, denke ich, nachvollziehen.

      Da ich zufälliger Weise (einer meiner Vorgänger hat den COM Server geschrieben) den CTD-Quellcode habe, werde ich nun schauen was ich tun kann.

      Wenn der Aufwand zu groß wird, wird der COM-Server entfernt und es wird alles über .NET gemacht.


      Gruß

      Comment

      Working...
      X