Re: Howto initialize a private (not registred) interface?
"jerker_back" <jerker.back@gmail.com> wrote in message
news:1796cf68-2d71-4cab-9d1e-0502dda89b4a@v21g2000pro.googlegroups.com
My application is a plugin module (DLL) which loads a PDB file and
analyze it with the help of interfaces in Visual Studio DIA SDK
(msdia.dll). The plugin is implemented in ATL but is not a COM server
and it must not be (at least not registred). Using the DIA SDK
interfaces with smart pointers is no problem, but there is one
interface which is just a stub - IDiaLoadCallback2. So, this interface
must be implemented by the plugin. IDiaLoadCallback2 allows you to
control where to find the debug database. I did it as an ATL simple
object like this:
class ATL_NO_VTABLE CCallback :
public ATL::CComObjectRootEx<ATL::CComSingleThreadModel>,
public ATL::CComCoClass<CCallback, &__uuidof(IDiaLoadCallback2)>,
The second parameter of CComCoClass should be a CLSID, not an interface
IID.
Since you don't need your class to be externally creatable, you don't
need to derive it from CComCoClass at all.
OBJECT_ENTRY_AUTO(__uuidof(IDiaLoadCallback2), CCallback)
Similarly, OBJECT_ENTRY_AUTO expects a CLSID as its first parameter, and
is not needed if you don't need your class to be creatable.
The plugin start routine initialize the DIA SDK interfaces like this:
ATL::CComPtr<IDiaDataSource> m_pDiaDataSource;
hr = m_pDiaDataSource.CoCreateInstance(__uuidof(DiaSource), NULL,
CLSCTX_INPROC_SERVER);
=> hr = S_OK
CCallback* m_pCallback;
hr = m_pDiaDataSource->QueryInterface(__uuidof(IDiaLoadCallback2),
(void**)&m_pCallback);
=> error: hr = E_NOINTERFACE
This doesn't make any sense. You have created some object implementing
IDiaDataSource interface. It's clearly not an instance of CCallback
(since CCallback doesn't implement IDiaDataSource). Then you query that
object for IDiaLoadCallback2. Is the object supposed to implement
IDiaLoadCallback2? Apparently not. Do you expect the object to magically
conjure up an instance of CCallback? That's not what QueryInterface is
for.
This is how you create an instance of your own COM object (one you have
source code access to):
CComObject<CCallback>* p;
CComObject<CCallback>::CreateInstance(&p);
// Careful: the object is created with refcount of zero.
CComPtr<IDiaLoadCallback2> spCallback;
p->QueryInterface(&spCallback);
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925