现在的位置: 首页 > 综合 > 正文

动态库的对话框中嵌入Com组件的问题

2014年01月23日 ⁄ 综合 ⁄ 共 587字 ⁄ 字号 评论关闭

前些天做一个内嵌有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则没有。

 

抱歉!评论已关闭.