WTL程序CoCreateInstance返回0x80004002

EDDGA 2017-12-11 09:10:13
有个MFC旧程序,工作时调用某个com组件。
最近用WTL改写,CoCreateInstance时返回0x80004002(不支持该接口)。为了测试,分别用MFC和WTL新建程序和COM组件,均在Main Frame加入相同的代码:
测试环境:
1、成功 = XP + VC6 + MFC的EXE + ATL COM组件
失败 = XP + VC6 + WTL 7.1的EXE + ATL COM组件

2、两个Main Frame分别加入成员:
private : CComPtr<ICom1> m_cmpt;


3、两个Main Frame的ctor加入如下代码:

::CoInitializeEx(NULL, COINIT_MULTITHREADED); //改用::CoInitialize(NULL)的话结果相同
CLSID clsid;
HRESULT hr ::CLSIDFromProgID(OLESTR("ATE.CCom1.1"), &clsid); //这里hr返回成功
hr = this->m_cmpt.CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER); //这里hr返回0x80004002
if (FAILED(hr)) {
this->msg(hr); //msg是自己加的,把hr改为16进制char[]并提示
}


4、把ICom1改成IUnknown,WTL的程序就不报0x80004002了
5、ICom1也是用ATL新建的,套间free + 接口custom + 不聚合

问题:同样的ICom1,MFC程序CoCreateInstance成功,WTL程序0x80004002,为什么哩?
...全文
430 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
EDDGA 2017-12-19
  • 打赏
  • 举报
回复
明白了,是因为_tWinMain里第1句就::CoInitialize(NULL)了,于是无论我后面再怎样::CoInitializeEx(NULL, COINIT_MULTITHREADED),套间FREE的组件都报0x80004002。 只要把_tWinMain里的改为::CoInitializeEx(NULL, COINIT_MULTITHREADED)就OK
赵4老师 2017-12-11
  • 打赏
  • 举报
回复

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧