Question

J'ai un composant ATL COM 32 bits sans une bibliothèque de type. Il dispose d'une usine de classe pour une classe donnée qui implémente plusieurs interfaces.

Quand je l'utilise comme un in-process serveur, tout fonctionne bien - le côté client invoque CoCreateInstance (), l'objet est instancié et QueryInterface () récupère un pointeur vers une interface demandée. Mais quand je mets le composant dans COM + je ne peux instancier la classe -. CoCreateInstance () retourne maintenant E_NOINTERFACE

Je crois que le problème est que COM + ne peut pas effectuer marshaling en raison de l'absence de bibliothèque de type - il n'a aucune idée de comment le faire. Ai-je besoin pour générer et enregistrer une bibliothèque de type pour résoudre ce ou est-il une autre façon?

Était-ce utile?

La solution

Urk. Je vous conseille de demander sur microsoft.public.vc.atl je pense que vous trouverez plus d'experts là-bas. Je pense (mais je ne suis pas un expert), la question a moins à voir avec COM + que la question de la procuration enregistrés / talons. (En d'autres termes, même si vous avez écrit votre propre client COM pour accéder à votre composant hors processus, vous auriez probablement courir le même problème) Si vous avez des interfaces compatibles standard d'automatisation, Windows sait comment marshaler vos objets tout bien. Mais sinon il est confus.

Sans une bibliothèque de type, soit vous devez vous enregistrer proxy / talons, ou le besoin de mettre en œuvre IMarshal vous pour gérer marshaling personnalisé. (Ou il y a aussi cette chose « gestionnaire marshaling » que je ne comprends pas)

Votre commentaire pourquoi vous ne disposez pas d'une bibliothèque de type (ont une interface déjà mise en œuvre définie par Microsoft, mais qui n'a pas un typelib) Déclenche un drapeau rouge avec moi. Pouvez-vous fournir plus de détails? Si c'est quelque chose dans un .DLL ou .EXE, mais les informations de type se trouve dans la bibliothèque elle-même (plutôt que d'un fichier TLB externe), il est sans doute possible d'extraire la bonne information à faire tout le travail, je ne suis pas au courant du processus.

(Pour mémoire, j'ai quitté la programmation ATL / COM en faveur de Java, donc bien que je peux vous dire ce que je me souviens dans le passé, je ne pas utiliser les outils maintenant et il serait difficile pour moi de se remettre en eux pour fournir plus d'aide. Mais les gens du microsoft.public.vc.atl sont assez intelligents.)

Autres conseils

Typelibs sont un moyen pour soutenir triage, DLL proxy / stub (genereated de l'IDL) sont un autre. Dans les deux cas, cependant, vous aurez besoin de l'IDL en premier lieu.

Si Microsoft ne fournit pas une DLL typelib / proxy ou IDL pour cette interface, les chances sont qu'il ya une raison pour cela: Peut-être que l'interface utilise des structures de données non-marshalable, nécessite des pointeurs de fonction à transmettre en tant que paramètre de méthode ou des choses comme ça? Si tel est le cas, il n'y a aucun moyen de faire ce travail d'interface pour DCOM.

Peut-être que vous pouvez reconstruire le IDL, mais tout à fait peut-être, juste ne sera pas possible. Ensuite, votre dernière fallback pourrait être d'utiliser marshalling personnalisé ou gestionnaire, mais c'est probablement pas la peine. Cela dit, je vous recommande d'envisager d'autres voies qui ne nécessitent pas l'utilisation d'interfaces pour DCOM qui ne sont pas conçus pour être utilisés pour DCOM.

Pour une interface COM à l'aide de marshallable placier par défaut de Microsoft, l'interface doit avoir soit le DOUBLE ou la propriété oleautomation définis dans son en-tête.

S'il y a des arguments pour les méthodes définies qui sont des pointeurs interface, la même exigence s'étend à ces interfaces.

De plus le nom de l'interface doit être présent dans la section de la bibliothèque de la définition IDL elle. Cela étend également à d'autres interfaces référencées.

Si ces conditions ne sont pas remplies, l'interface ne sera pas marshallable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top