2009-05-12 9 views
3

Ich habe eine 32-Bit-ATL-COM-Komponente ohne eine Typbibliothek. Es hat eine Klassenfabrik für eine bestimmte Klasse, die mehrere Schnittstellen implementiert.Was ist erforderlich, um das Marshalling für eine COM-Schnittstelle zu aktivieren?

Wenn ich es als in-proc-Server verwende, funktioniert alles einwandfrei - die Client-Seite ruft CoCreateInstance() auf, das Objekt wird instanziiert und QueryInterface() ruft einen Zeiger auf eine angeforderte Schnittstelle ab. Aber wenn ich die Komponente in COM + lege, kann ich die Klasse nicht mehr instanziieren - CoCreateInstance() gibt jetzt E_NOINTERFACE zurück.

Ich glaube, das Problem ist, dass COM + Marshalling wegen Abwesenheit der Typbibliothek nicht durchführen kann - es hat keine Ahnung, wie es geht. Muss ich eine Typbibliothek generieren und registrieren, um dies zu beheben oder gibt es eine andere Möglichkeit?

+0

Die ATL-Projektassistenten sind normalerweise so eingerichtet, dass sie eine Typelib haben, die als Ressource in die Projektausgabe eingebettet und bei den Co-Klassen registriert ist. – Richard

+0

Ja, das weiß ich. Das Problem ist, dass ich eine von Microsoft bereits definierte Schnittstelle implementiere, für die keine Idl-Datei oder Typbibliothek bereitgestellt wird. Deshalb werde ich es schwer haben, die Typbibliothek voller benutzerdefinierter Typen neu zu erfinden. – sharptooth

+0

fyi, es ist "Marshalling" im Kontext von COM, "Marshalling" im Kontext von Java. :-) –

Antwort

1

Urk. Ich würde empfehlen, auf microsoft.public.vc.atl zu fragen, da ich denke, dass Sie dort mehr Experten finden werden. Ich denke (obwohl ich kein Experte bin), hat das Problem weniger mit COM + als mit der Ausgabe von registrierten Proxy/Stubs zu tun. (Mit anderen Worten, selbst wenn Sie einen eigenen COM-Client für den prozessunabhängigen Zugriff auf Ihre Komponente geschrieben hätten, würden Sie wahrscheinlich auf das gleiche Problem stoßen.) Wenn Sie über standardmäßige Automatisierungs-kompatible Schnittstellen verfügen, weiß Windows, wie Sie Ihre Objekte einfach marshallen können fein. Aber sonst ist es verwirrt.

Ohne eine Typbibliothek müssen Sie entweder Proxy/Stubs registrieren oder IMarshal implementieren, um das benutzerdefinierte Marshalling zu verarbeiten. (oder es gibt auch dieses "Handler Marshalling" -Ding, das ich nicht verstehe)

Ihr Kommentar darüber, warum Sie keine Typbibliothek haben (implementieren eine Schnittstelle bereits von Microsoft definiert, aber eine, die keine a typelib) wirft eine rote Fahne mit mir. Können Sie mehr Details angeben? Wenn es etwas in einer .DLL oder .EXE ist, aber die Typinformationen innerhalb der Bibliothek selbst liegen (anstatt einer externen .TLB-Datei), ist es wahrscheinlich möglich, die richtigen Informationen zu extrahieren, damit alles funktioniert, ich kenne mich einfach nicht aus verarbeiten.

(Für den Datensatz habe ich ATL/COM-Programmierung zugunsten von Java verlassen, also kann ich Sie wissen lassen, an was ich mich in der Vergangenheit erinnere, ich benutze die Tools jetzt nicht und es wäre schwierig für Ich bin zurück zu ihnen, um weitere Hilfe zu bieten. Aber die Leute auf der microsoft.public.vc.atl sind ziemlich schlau.)

+0

Wenn die ATL-Usenet-Gruppe Hilfe bietet, fassen Sie die Informationen bitte hier zusammen. – Aardvark

+0

Ich habe die IDL-Datei in der späteren Version von Microsoft SDK gefunden. Ich könnte es in das Projekt einbeziehen und das würde das Problem lösen. Die Schnittstelle ist jedoch aufgrund mehrerer benutzerdefinierter Typen nicht automatisierungskompatibel. Also stellte ich meine eigene Schnittstelle vor, die man gerne zusammenstellen würde und erstellte eine Frontend-Komponente, die die ursprüngliche Schnittstelle und getunnelte Aufrufe an meine Komponente implementierte. Auf diese Weise funktioniert es über COM + und ich muss jetzt nur eine 64-Bit-Version für das Frontend erstellen und nicht für all die Dinge, von denen die innere Komponente abhängt. – sharptooth

2

Typelibs sind eine Möglichkeit, Marshalling, Proxy/Stub-DLLs (aus dem IDL) sind andere. In beiden Fällen benötigen Sie jedoch die IDL.

Wenn Microsoft keine typelib/proxy DLL oder IDL für diese Schnittstelle zur Verfügung stellt, besteht die Wahrscheinlichkeit, dass es einen Grund dafür gibt: Vielleicht verwendet die Schnittstelle nicht marshalable Datenstrukturen, erfordert Funktionszeiger als Methodenparameter oder Dinge wie dieses? Wenn dies der Fall ist, gibt es keine Möglichkeit, diese Schnittstelle für DCOM zu verwenden.

Vielleicht können Sie die IDL rekonstruieren, aber möglicherweise ist es einfach nicht machbar. Dann könnte Ihr letzter Fallback sein, benutzerdefinierte oder Handler-Marshalling zu verwenden, aber das ist wahrscheinlich nicht die Mühe wert. Ich würde jedoch empfehlen, andere Routen in Betracht zu ziehen, bei denen keine Schnittstellen für DCOM verwendet werden, die nicht für DCOM vorgesehen sind.

0

Damit eine COM-Schnittstelle mithilfe des Standard-Marshallers von Microsoft marshallierbar ist, muss die Schnittstelle die Eigenschaft DUAL oder OLEAUTOMATION in der Kopfzeile definiert haben.

Wenn Argumente für die definierten Methoden vorhanden sind, die Schnittstellenzeiger sind, gilt dieselbe Anforderung auch für diese Schnittstellen.

Außerdem muss der Schnittstellenname im Abschnitt BIBLIOTHEK der IDL vorhanden sein, die ihn definiert.Dies gilt auch für andere referenzierte Schnittstellen.

Wenn diese Bedingungen nicht erfüllt sind, ist die Schnittstelle nicht marshalbar.