Frage

Ich habe eine 32-Bit-ATL COM-Komponente ohne eine Typbibliothek. Es hat eine Klassenfactory für eine bestimmte Klasse, die mehrere Schnittstellen implementiert.

Wenn ich es als In-proc-Server verwenden, funktioniert alles einwandfrei - der Client-Seite ruft CoCreateInstance (), wird das Objekt instanziiert und Query-Interface () ruft einen Zeiger auf eine angeforderte Schnittstelle. Aber wenn ich die Komponente in COM setzen + ich kann nicht mehr die Klasse instanziiert -. CoCreateInstance () gibt nun E_NOINTERFACE

Ich glaube, das Problem ist, dass COM + nicht durchführen kann wegen des Fehlens von Typ-Bibliothek Marshalling - es hat keine Ahnung, wie es zu tun. Muß ich eine Art Bibliothek erzeugen und zu registrieren, dieses Problem zu beheben, oder gibt es eine andere Möglichkeit?

War es hilfreich?

Lösung

Urk. Ich würde empfehlen, auf fragen microsoft.public.vc.atl wie ich glaube, Sie mehr Experten dort finden werden. Ich denke, (obwohl ich kein Experte bin) das Problem weniger mit COM + als die Ausgabe von Namens Proxy / Stubs zu tun. (Mit anderen Worten, auch wenn Sie Ihren eigenen COM-Client schrieb die Komponente für den Zugriff auf Out-of-Process, würden Sie wahrscheinlich in die gleiche Ausgabe führen) Wenn Sie Standard-Automation-kompatible Schnittstellen, dann weiß Windows-wie Ihre Objekte Marschall nur fein. Aber ansonsten ist es verwirrt.

Ohne eine Art Bibliothek, müssen Sie entweder Proxy / Stubs registrieren, oder müssen IMarshal selbst implementieren individuelle Handhabung Marshalling. (Oder gibt es auch diese „Handler Serialisieren“ Sache, die ich nicht verstehe)

Ihr Kommentar darüber, warum Sie keine Typbibliothek verfügen (eine Schnittstelle bereits von Microsoft definierte Implementierung, sondern eine, die keine typelib hat) wirft eine rote Fahne mit mir. Können Sie weitere Informationen zur Verfügung stellen? Wenn es etwas ist, in einem .DLL oder .EXE, aber die Typinformationen in der Bibliothek selbst (und nicht als eine externe TLB-Datei) ist es wahrscheinlich möglich ist, die richtigen Informationen zu extrahieren, alles funktioniert, ich bin einfach nicht vertraut ist mit der Prozess.

(Für das Protokoll habe ich links ATL / COM-Programmierung für Java, so dass, obwohl ich lasse Sie wissen, was ich in der Vergangenheit erinnern, habe ich die Werkzeuge nicht jetzt verwenden und es wäre für mich schwierig sein, wieder in sie zu erhalten, mehr Hilfe zu leisten. Aber die Leute auf der microsoft.public.vc.atl sind ziemlich smart.)

Andere Tipps

Typelibs sind eine Möglichkeit, Rangier-, Proxy / stub DLLs zu unterstützen (genereated vom IDL) sind eine andere. In beiden Fällen jedoch müssen Sie die IDL an erster Stelle.

Wenn Microsoft keine typelib / Proxy-DLL oder IDL für diese Schnittstelle zur Verfügung stellen, stehen die Chancen, dass es einen Grund dafür: Vielleicht ist die Schnittstelle verwendet nicht-marshalable Datenstrukturen erfordert Funktionszeiger als Methodenparameter oder Dinge übergeben werden so was? Wenn dies der Fall ist, gibt es einfach keine Möglichkeit, diese Schnittstelle Arbeit für DCOM zu machen.

Vielleicht können Sie die IDL, rekonstruieren, aber sehr wahrscheinlich, wird es einfach nicht machbar sein. Dann könnte Ihr letzten Rückfall seine benutzerdefinierte oder Handler Rangierung zu verwenden, aber das ist wahrscheinlich nicht die Mühe wert. Das heißt, ich würde empfehlen, andere Routen unter Berücksichtigung, die beinhaltet keine Schnittstellen für die DCOM verwenden, die nicht für DCOM verwendet werden entworfen.

Für eine COM-Schnittstelle rangierbaren mit Microsofts Standard-Einweiser zu sein, die Schnittstelle zu haben, hat entweder die DUAL oder die Oleautomation Eigenschaft in seinem Header definiert ist.

Wenn es Argumente für die Methoden sind definiert, die Schnittstellenzeiger sind, die gleiche Forderung erstreckt sich auf diese Schnittstellen.

Plus der Interface-Name muss die Definition in der Bibliothek Abschnitt der IDL vorhanden sein. Dies erstreckt sich auch auf andere verwiesen Schnittstellen.

Wenn diese Bedingungen nicht erfüllt sind, wird die Schnittstelle nicht rangierbaren sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top