none
Zugriff auf Com-Objekt per DispID oder Offset? RRS feed

  • Frage

  • folgendes Szenario:

    es gibt ein (c++)-Com-Objekt, das hier von mehreren Modulen benutzt wird. Jedes dieser Module liefert dabei bei dessen Installation eine eigene Version der Com-Komponente mit aus, die ggf. (falls neuer als die bestehende) installiert und registriert wird.

    Mein eigenes C#-Modul greift ebenfalls per Com auf diese Komponente zu. Hierzu wurde also die Com-Komponente als Referenz zu meinem C#-Projekt hinzugefügt, eine passende Interop-dll erstellt (durch den Wizard automatisch generiert) und auf dem Entwicklungsrechner läuft soweit dann auch alles.

    Das Problem ist nun, daß ich zur Laufzeit nie genau weiß, auf welche Version der Com-Komponente ich treffe. Um dem zu begegnen, hat die Com-Komponente eine Com-Methode "GetVersion" bekommen, über die man die Version der Komponente zur Laufzeit ermitteln und dann geeignet reagieren kann. 

    Das Problem ist nun folgendes: Treffe ich zur Laufzeit auf eine neuere Version der Komponente, die noch zusätzliche Methoden HINTER (also eine höhere Disp-ID) der GetVersion-Methode hat, funktioniert alles prima - ich bekomme die Version der Com-Komponente heraus und die neueren Funktionen rufe ich ja eh nicht auf.

    Wenn nun aber in der Zwischenzeit eine neue Methode/Property VOR die GertVersion-Methode in die Com-Dll gewandert ist, gelingt nichtmal mehr der Aufruf zu GetVersion und ich bekomme stattdessen eine Exception (glaub es war eine AccessNotAllowedException).

    Wenn ich mir die generierte Interop-Dll ansehe (Reflector) , steht da für GetVersion

    [MethodImpl(MethodImplOptions.InternalCall,

    MethodCodeType=MethodCodeType.Runtime), DispId(0x1a)] public virtual extern object GetVersion([MarshalAs(UnmanagedType.Struct)] out object vMajor,

    [MarshalAs(UnmanagedType.Struct)] out object vMajorRevision,

    [MarshalAs(UnmanagedType.Struct)] out object vMinor,

    [MarshalAs(UnmanagedType.Struct)] out object vMinorRevision); [return: MarshalAs(UnmanagedType.Struct)]


    mit anderen Worten: Es ist ja durchaus die Disp-ID der Methode bekannt, die sich durch das Einfügen einer anderen Methode ja auch nicht ändert, inssofern hätte ich angenommen, daß die Aufrufe dennoch funktionieren? Oder wird stattdessen irgendein Offset/Index beim Methodenaufruf angesprungen, der sich durch das Einfügen einer Methode ändert?

    Wie bekomme ich es hin, daß die Methode über ihre DispID angesprungen wird? 

    Micha




    • Bearbeitet Ciprian Bogdan Mittwoch, 11. Dezember 2013 12:25 Codeblock
    Montag, 9. Dezember 2013 16:20

Antworten

  • hab die antwort hier im c++-forum gefunden

    http://social.msdn.microsoft.com/Forums/de-DE/4f117889-0fe2-4c0c-8778-ea439bb7bd44/zugriff-auf-comobjekt-aus-net-nicht-ber-dispidname?forum=visualcplusde


    • Bearbeitet suriel6666 Donnerstag, 12. Dezember 2013 11:27
    • Als Antwort markiert suriel6666 Donnerstag, 12. Dezember 2013 11:44
    Donnerstag, 12. Dezember 2013 11:27

Alle Antworten