Re: CoCreateInstance Cannot Fetch IUnkown?
I did some further investigation.
After CoGetClassObject from some troublesome component, I got pointer
to IClassFactory. The I invoke IClassFactory::CreateInstance to get
IUnknown interface. It fails. Now, I know the problem is not due to
CoCreateInstance, but due to implementation of some component, because
IClassFactory::CreateInstance doens't respond correctly if IID is
IID_IUnkown.
Morgan Cheng =E5=86=99=E9=81=93=EF=BC=9A
I am working on a Disk-Cleanup program. Disk-Cleanup utility in works
works with COM. In Windows Registry
"HKLM/Software/Microsoft/Windows/CurrentVersion/Explorer/VolumeCache",
there are info about all COM components that is for different kinds of
temp files.
I used _com_ptr_t and found it cannot create instance for some
component. So I checked code in _com_ptr_t::CreateInstance(). It is as
below:
// Loads an interface for the provided CLSID.
// Returns an HRESULT. Any previous interface is unconditionally
released.
//
HRESULT CreateInstance(const CLSID& rclsid, IUnknown* pOuter =
NULL, DWORD dwClsContext = CLSCTX_ALL) throw()
{
HRESULT hr;
_Release();
if (dwClsContext & (CLSCTX_LOCAL_SERVER |
CLSCTX_REMOTE_SERVER)) {
IUnknown* pIUnknown;
hr = CoCreateInstance(rclsid, pOuter, dwClsContext,
__uuidof(IUnknown), reinterpret_cast<void**>(&pIUnknown));
if (SUCCEEDED(hr)) {
hr = OleRun(pIUnknown);
if (SUCCEEDED(hr)) {
hr = pIUnknown->QueryInterface(GetIID(),
reinterpret_cast<void**>(&m_pInterface));
}
pIUnknown->Release();
}
}
else {
hr = CoCreateInstance(rclsid, pOuter, dwClsContext,
GetIID(), reinterpret_cast<void**>(&m_pInterface));
}
if (FAILED(hr)) {
// just in case refcount = 0 and dtor gets called
m_pInterface = NULL;
}
return hr;
}
I set some point and found that the CreateInstance breaks at
"CoCreateInstance(rclsid, pOuter, dwClsContext, __uuidof(IUnknown),
reinterpret_cast<void**>(&pIUnknown))". For Some some components it
fails, for others it is OK.
This is weird. Any component should support IUnkown interface. I write
some code the check the component by CoGetClassObject and get IUnkown
successfully. It confuses me. I believe that CoCreateInstance must do
something strange so that it cannot load some (not all) components.
Is it possible that component disable client to get its IUnkown through
CoCreateInstance?
Thanks