Pregunta

Tengo un componente COM de ATL de 32 bits sin una biblioteca de tipos. Tiene una fábrica de clase para una clase dada que implementa varias interfaces.

Cuando lo uso como un servidor en proceso, todo funciona bien - el lado del cliente invoca a CoCreateInstance (), el objeto se crea una instancia y QueryInterface () recupera un puntero a una interfaz solicitado. Pero cuando pongo el componente en COM + ya no puedo crear una instancia de la clase -. CoCreateInstance () devuelve ahora E_NOINTERFACE

Creo que el problema es que COM + no puede realizar el cálculo de referencias debido a la ausencia de biblioteca de tipos - que no tiene idea de cómo hacerlo. ¿Es necesario para generar y registrar una biblioteca de tipos para resolver este o hay alguna otra manera?

¿Fue útil?

Solución

Urk. Recomendaría pedir en microsoft.public.vc.atl como creo que encontrará más expertos allí. Creo que (aunque no soy un experto) el tema tiene menos que ver con COM + que el tema de proxy / talones registrados. (En otras palabras, incluso si usted escribió su propio cliente COM para acceder a su componente fuera de proceso, es probable que correr en la misma edición) Si tiene interfaces estándar compatible con la automatización, a continuación, Windows sabe cómo calcular sus objetos solo multa. Pero por lo demás se confunde.

Sin una biblioteca de tipos, ya sea que necesita registro proxy / recibos, o la necesidad de poner en práctica IMarshal a sí mismo para manejar el cálculo personalizado. (O también hay este "manejador de cálculo de referencias" cosa que no entiendo)

Su comentario acerca de por qué usted no tiene una biblioteca de tipos (la implementación de una interfaz ya definida por Microsoft, pero que no tiene una biblioteca de tipos) levanta una bandera roja conmigo. puedes darme mas detalles? Si es algo que en un .DLL o .EXE, pero la información de tipo se encuentra dentro de la propia biblioteca (en lugar de un archivo .tlb externa) es probable que sea posible extraer la información correcta para que todo funcione, no estoy familiarizado con el proceso.

(Para el registro, he dejado de programación / COM ATL a favor de Java, por lo que aunque puedo hacerle saber lo que recuerdo en el pasado, no uso las herramientas ahora y sería difícil para mí para volver a ellos para proporcionar más ayuda. Pero la gente en la microsoft.public.vc.atl son bastante inteligentes.)

Otros consejos

TypeLibs son una forma de apoyar DLL de clasificación, proxy / stub (genereated de la IDL) son otro. En ambos casos, sin embargo, tendrá el IDL en el primer lugar.

Si Microsoft no proporciona una DLL de biblioteca de tipos / proxy o IDL para esta interfaz, las probabilidades son que hay una razón para esto: Tal vez la interfaz utiliza estructuras de datos no marshalable, requiere punteros de función que se pasa como parámetro de método o cosas ¿Me gusta esto? Si este es el caso, simplemente no hay manera de que esto funcione interfaz para DCOM.

Tal vez se puede reconstruir el IDL, pero muy posiblemente, sólo que no será factible. Luego de su último repliegue podría ser el uso de la costumbre o manejador de clasificación, pero eso no es probablemente vale la pena el esfuerzo. Dicho esto, me gustaría recomendar considerar otras rutas que no esté relacionado con el uso de interfaces para DCOM que no fueron diseñados para ser utilizados para DCOM.

Para una interfaz COM para ser marshallable usando marshaller por defecto de Microsoft, la interfaz tiene que tener ya sea el DUAL o la propiedad oleautomation definen en su cabecera.

Si hay argumentos para los métodos definidos que son punteros de interfaz, el mismo requisito se extiende a esas interfaces.

Además, el nombre de la interfaz debe estar presente en la sección BIBLIOTECA del IDL definirlo. Esto también se extiende a otras interfaces de referencia.

Si estas condiciones no se cumplen, la interfaz no será marshallable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top