Acceda a un método de interfaz COM C ++
Pregunta
Ambos:
- CLSID
- IID
Habiendo especificado lo anterior y usando:
- CoCreateInstance()
Para devolver un único objeto sin inicializar de la clase especificada por el CLSID anterior.
¿Cómo puedo acceder al método de una interfaz desde C ++? Sin:
- ATL
- MFC
- Simplemente C ++
Después, uso CreateInstance ()
Tengo problemas al usar CreateInstance () - con el último parámetro - ppv
Utilizando oleview, puedo ver los métodos del IID especificado arriba del IID anterior, como:
interface IS8Simulation : IDispatch {
HRESULT Open([in] BSTR FileName);
};
¿Cómo puedo acceder a lo anterior? Ejemplos / orientación - por favor
Saludos
Solución
Al hacer una CoCreateInstance obtienes un puntero de interfaz. A través del método QueryInterface (...) puede obtener fácilmente el puntero de la interfaz de alguna otra interfaz. p.ej.,
IUnknown* pUnk = NULL; HRESULT hr = ::CoCreateInstance(clsid,NULL,CLSCTX_ALL,__uuidof(IUnknown),(void**)&pUnk);
IS8Simulation* pSim = NULL; hr = pUnk->QueryInterface(__uuidof(IS8Simulation), (void**)&pSim);
Después de hacer esto, obtendrá el puntero a IS8Simulation en pSim y a través de eso podrá llamar a los métodos de esa interfaz. Recuerde que debe proporcionar un clsid válido en la llamada CoCreateInstance.
Otros consejos
Es un poco vago cuál es el problema real. Algún código sería útil. Pero para adivinar, ¿necesita QueryInterface?
IS8Simulation* pSim = NULL;
hr = pUnk->QueryInterface(__uuidof(IS8Simulation), (void)&pSim);
Intentaré lo anterior, pero si se declara IS8Simulation, disculpe mi falta de COM comprensión
Además, cómo llamar al método, a continuación, usando C ++ simple :
HRESULT Open([in] BSTR FileName)
Probablemente desee #import " something.dll " ;. Esto le dará declaraciones de C ++ para tipos como IS8Simulation, similar a lo que #include " something.h " haría.