Tengo una clase COM CMyCOMServer
que implementa IMyInterface
en una aplicación, ambas con GUID correctos. CMyCOMServer::QueryInterface
devolverá S_OK (y se lanzará al tipo correcto) si se solicita IUnknown o IMyInterface, de lo contrario, devuelve E_NOINTERFACE.CoCreateInstance que devuelve E_NOINTERFACE aunque se encuentra la interfaz
En otra aplicación en el mismo ordenador, me llaman:
HRESULT hr = ::CoCreateInstance(__uuidof(CMyCOMServer), 0, CLSCTX_SERVER,
__uuidof(IMyInterface),(void **)&pInterface);
Devuelve E_NOINTERFACE. Así que asumí que estaba haciendo algo mal y agregué un punto de interrupción en CMyCOMServer::QueryInterface
. He descubierto que cuando se llama CoCreateInstance
, QueryInterface
se dispara varias veces para diferentes interfaces:
- En primer lugar, se solicita IUnknown - se solicitan ningún problema
- Entonces, varias interfaces como IMarshall etc ... estos no son compatibles por lo que se devuelve E_NOINTERFACE
- Finalmente, se solicita IMyInterface. Verifico QueryInterface devuelve S_OK y establece
(IMyInterface *)this
como el puntero de interfaz, como se esperaba
Así que mi confusión es la razón por la CoCreateInstance llamada me está dejando un puntero NULL y código de retorno de E_NOINTERFACE, cuando la aplicación de servidor COM está volviendo claramente la interfaz que pido?
EDITAR: mi aplicación cliente llama a CoInitialize (NULL) al inicio, esto no hace ninguna diferencia.
Solo para aclarar: se ejecuta el servidor COM en una aplicación, y el cliente en aonother aplicación? Porque eso significa que se encontrarán en procesos diferentes, y eso a su vez significa que necesita una combinación, posiblemente personalizada. – MSalters
Sí lo hacen. Dos aplicaciones separadas en 1 PC. Sin embargo, nunca tuve que meterme con Marshalling antes, es por eso que estoy confundido. Apenas lo había escuchado antes y he hecho una buena cantidad de desarrollo de COM. –