none
C++ COM-Schnittstelle Anbindung Problem! RRS feed

  • Frage

  • Hallo Zusammen,

    ich arbeite gerade an der Entwicklung eines Plugins in FrameMaker, welches in c++ realisiert wird. Ich binde die tlb-Bibliotheken ein, die eine COM-Schnittstelle repräsentieren und selbst mit der SOAP-Schnittstelle kommunizieren. Das Problem ist, ich erstelle im FM-Plugin ein Objekt, welches in der SOAP-Schnittstele als Public deklariert ist und versuche auf die Public Properties zuzugreifen. Dies ist aber aus irgendeinem Grund nicht möglich.

    Beispiel:

                HRESULT result;

                iMatchClientAPI::_AbbreviationsPtr abbr;

                result = abbr.CreateInstance(__uuidof(iMatchClientAPI::Abbreviations));

                abbr = _app->GetAbbreviations();

                abbr->"Hier sollen die Properties angezeigt werden!"

    Ich habe die Bibliothek in dem OLE-Viewer angeschaut und da steht, dass die Klasse Abbreviations gar keine Properties hat, also sind die nicht sichtbar. Was mich aber dabei wundert, dass die gleiche Einbindung im Word-Plugin diese Möglichkeit bietet. Es ist dann halt in VB.NET realisiert.

    Ich bitte um Hilfe, da schon einige Stunden erfolglos investiert sind um eine mögliche Lösung zu finden.

    Donnerstag, 17. Januar 2013 08:09

Alle Antworten

  • Vermutlich wird hier Late-Binding verwendet... Du verwendest hier Early-Binding...

    Schau Dir mal das Interface "IDispatch" an, welches für Late-Binding verantwortlich ist.

    Nicht jedes COM-Interface stellt ein "Native" oder "Dual" Interface zur Verfügung. Die meisten machen i.d.R. "IDispatch", da dies aus Skrip-Sprachen einfacher anzubinden ist.

    Siehe dazu auch meine C-Helper-Methoden:
    http://blog.kalmbachnet.de/?postid=63


    Jochen Kalmbach (MVP VC++)
    Donnerstag, 17. Januar 2013 08:39
  • Vielen Dank für die Antwort.

    Ich habe versucht inzwischen das Problem durch neue Abstraktionsebene zu lösen, indem ich eine Klasse in der COM-Schnittstelle geschrieben habe, die eine Art Adapter darstellt und die SOAP Objekte bearbeitet.

    Dazu sind 2 Andere Klassen erstellt worden: eine Klasse mit den Interfaces und eine mit Klassen, die diese Interfaces Implementieren und die Public Getters und Setters anbieten. Diese Klassen sind die Abbildungen der SOAP Objekten.

    Im Adapter werden die Funktionen aufgerufen aber es werden statt SOAP Objekten das Interface zurückgegeben. In dem C++ Projekt sind dann alle Properties sichtbar, allerdings in der generierten tli Datei wird als Result der raw_beispielFunktion das Ergebnis E_NOINTERFACE zurückgeliefert...

    Freitag, 18. Januar 2013 13:53
  • Hast Du meine Antwort schon durchgelesen?


    Jochen Kalmbach (MVP VC++)
    Freitag, 18. Januar 2013 20:43
  • Hallo, ich werde es mir jetzt anschauen. Danke.
    Montag, 21. Januar 2013 09:11
  • Ja, ich habe es gelesen, allerdings ist es , soweit ich es verstanden habe, nicht möglich, auf die Properties im Code zuzugreifen, da das Objekt bei Late Binding erst später definiert wird. Ich muss aber die Objekteigenschaften nutzen. 

    Das ist aber hier nicht möglich. Habe ich das richtig verstanden?

    Mein Beispiel:

        HRESULT result;

                iMatchClientAPI::_AbbreviationsPtr abbr = _app->GetAbbreviations();;

             for (int i=0;i<abbr.count;i++){

    cout <<abbr.item[i];

    }

    Montag, 21. Januar 2013 13:43