CoInitialize与CoInitializeEx,AfxOleInit()的不同

CoInitialize和AfxOleInit都是用于初始化COM库,但AfxOleInit额外初始化了与OLE应用相关的功能,如剪贴板、拖放等。AfxOleInit在MFC DLL中不会调用OleInitialize,而在exe中可能因afxContextIsDLL宏导致相同问题。CoInitializeEx可指定线程并发模型,常用于多线程环境。MFC应用程序中可能出现AfxOleInit未成功初始化COM的问题,需要根据项目类型调整初始化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CoInitialize()和AfxOleInit()都是初始化COM库,可它们有什么不同呢

    OLE是建立在COM之上的技术,层次比COM要高。AfxOleInit()调用的是OleInitialize(),而 OleInitialize()除了调用CoInitializeEx()来初始化COM库外,还进行一些其它的操作,这些操作对OLE应用来说是必须的,这些OLE应用包括:  
    (1)Clipboard;  
    (2)Drag   and   drop;  
    (3)Object   linking   and   embedding(现在的OLE,已不再仅仅是Object   linking   and   embedding的概念);  
    (4)In-place   activation;  
    与AfxOleInit()对应的是,AfxOleTerm()。  

    AfxOleInit()和AfxOleTerm()其实也是需要成对的,但是,在你的程序中,AfxOleTerm()可以不出现,这是因为,MFC已经帮你做好了(有兴趣的话,你可以仔细研究一下CWinThread::m_lpfnOleTermOrFreeLib,而CWinApp是从CWinThread继承的)。

注:但是当你的函数出现了重复调用AfxOleInit()时间便不能依靠mfc自动调用了,需要显式的调用AfxOleTerm清理com库


CoInitialize与 AfxOleInit

使用MFC的控制台主程序中如果用AfxOleInit()初始化com就会出现DLL中调用wordApp.CreateDispatch("Word.Application",NULL)失败,而改用用CoInitialize()则会成功

在AfxOleInit()函数中设置断点调试之后可以知道: afxContextIsDLL这个标志的值为ture,因而它并不会去调用 OleInitialize ,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值