OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别 afxoleinit 如何使用

OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别 afxoleinit 如何使用
CoInitialize CoInitializeEx 是用来初始化COM运行环境的。OleInitial--ize是初始化Ole的运行环境,Ole是在Com的基础上作的扩展,是ActiveX运行的基础,OleInitialize肯定会调用CoInitialize。
CoInitialize、CoInitializeEx都是windows的API,主要是告诉windows以什么方式为程序创建COM对象,原因是程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。 CoInitialize指明以单线程方式创建。 CoInitializeEx可以指定COINIT_MULTITHREADED以多线程方式创建。 创建单线程方式的COM服务器时不用考虑串行化问题,多线程COM服务器就要考虑。 CoInitialize并不装载com库,这个函数只是用来初始化当前线程使用什么样的套间。当使用这个函数以后,线程就和一个套间建立了对应关系。 线程的套间模式决定了该线程如何调用com对象,是否需要列集等 套间是com中用来解决并发调用冲突的很有效的办法 Before calling any COMfunctions, a thread needs to call CoInitialize to load the COMinfrastructure (and to enter an apartment). Once a thread callsCoInitialize, the thread is free to call COM APIs. CoInitializeEx providesthe same functionality as CoInitialize and also provides aparameter to explicitly specify the thread's concurrency model. Thecurrent implementation of CoInitialize calls CoInitializeEx andspecifies the concurrency model as single-thread apartment.Applications developed today should call CoInitializeEx rather thanCoInitialize. 注:新的应用程序应该调用CoInitializeEx而不是CoInitialize,否则就会有必要在之后每个调用Com的线程中调用CoInitialize来初始化出每个线程自己的套间。AfxOleInit实际上调用了OleInitialize,虽然它在内部也调用了CoInitializeEx,但它只能处理单线程,这是AfxOleInit和CoInitialize主要区别: OleInitialize calls CoInitializeEx internally to initialize the COM library on the current apartment. Because OLE operations are not thread-safe, OleInitialize specifies the concurrency model as single-thread apartment. Once the concurrency model for an apartment is set, it cannot be changed. A call to OleInitialize on an apartment that was previously initialized as multithreaded will fail and return RPC_E_CHANGED_MODE.应用:1. CoInitialize仅仅初始化Com,支持多线程。也就是说如果多线程调用Com接口,必须在每个线程中都调用CoInitialize。2. OleInitialize初始化Com(其实也是调用CoInitializeEx),支持多线程。比CoInitialize多了一下内容:A) ClipboardB) Drag and dropC) Object linking and embedding (OLE)D) In-place activation如果不需要这些,用CoInitialize就可以。3.AfxOleInit是MFC对OleInitialize的封装。貌似不支持多线程,也就是说只能在主进程调用该函数,如果线程需要使用Com必须调用上面的两个来实现初始化。而且MSDN明确标明AfxOleInit不能在MFC的DLL中调用,否则也会造成初始化失败。4.OleInitialize和OleUninitialize()成对使用;CoInitialize和CoUninitialize成对使用;CoInitializeEx和CoUninitialize成对使用;AfxOleInit()由MFC自动释放。VC++使用ADO访问ACCESS时,出现_RecordsetPtr Open卡或者_ConnectionPtrExcute卡或者_CommandPtrExcute一直卡住等莫名其妙的情况时,而语法又没有错误时,请确定初始化COM函数。MFC程序建议使用AfxOleInit()。

  

爱华网本文地址 » http://www.aihuau.com/a/25101016/303335.html

更多阅读

食品、保健品和药品的批准文号区别 食品药品批准文号查询

食品、保健品和药品的批准文号区别食品、保健品和药品均使用不同的批准文号,而这些批准文号在近几年又因为审批权限移交、政策调整和法规修订等原因,曾有过更换。对于药品,现在国家规定统一使用的批准文号是“国药准字”号,即平常所说

图片欣赏——牡丹、芍药和月季花 牡丹和芍药区别图片

图片欣赏——牡丹、芍药和月季花牡丹是中国特有的名花,属于毛茛科芍药属的木本花卉。牡丹花在我国被称为花中之王,素有“国色天香”、“富贵之花”和“花中之王”的美称。牡丹在中国至少已经栽培了一千四百多年。在古代本来没有牡丹

节拍、节拍之间的区别以及如何掌握乐曲的速度节选 节拍速度

节拍、节拍之间的区别节拍就是标记拍子的记号,他通常跟在调号的后面,我们常用的节拍有以下几种,2/4、3/4、4/4、3/8、6/8。分子表明一个小节内的单位拍的数目,分母表示单位拍的音符时值。比如:2/4拍子,就是以四分音符为一拍,每小节有两拍

借条、欠条和收到条的区别 借条跟欠条有什么区别

借条、欠条和收到条的区别借条是单纯的借贷关系,无需其他证据证明即可说明双方是借贷法律关系。也就是说,如果你有某人的借条在手,对方迟迟不肯还款,你仅凭这张欠条到法院起诉是完全有把握胜诉的。欠条是证明双方存在过债权债务关系,但此

声明:《OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别 afxoleinit 如何使用》为网友盛夏已如深秋分享!如侵犯到您的合法权益请联系我们删除