前些天做一个内嵌有IE控件的对话框,我把对话框类封装在一个MFC Regular DLL中。然后测试时发现对话框弹出后,怎么也不能显示出IE的控件。用同样的方法,直接把Dialog放在一个MFC APP程序中测试,弹出的对话框可以正常显示IE控件。APP和DLL初始化时都调用了AfxEnableControlContainer();
后来直接跟踪DLL中的COM创建,跟踪到occsite.cpp文件的344行:
...
if (SUCCEEDED(hr = CoGetClassObject(clsid, dwClsCtx, NULL,
IID_IClassFactory, (void**)&pClassFactory)))
{
ASSERT(pClassFactory != NULL);
hr = pClassFactory->CreateInstance(pUnkOuter, iid, ppv);
pClassFactory->Release();
}
...
发现hr的返回值是:0x800401f0 尚未调用 CoInitialize。
这就明白了,然后在DLL的InitInstance()中加上一行
::CoInitialize(NULL);
就OK了。
APP程序能够创建组件成功,说明MFC的APP基类初始化代码中已经调用过了CoInitialize,而DLL则没有。