cy model as single-thread apartment. Applications developed todayshould call CoInitializeEx rather than CoInitialize.
注:新的应用程序应该调用CoInitializeEx而不是CoInitialize,否则就会有必要在之后每个调用Com的线程中调用CoInitialize来初始化出每个线程自己的套间。
AfxOleInit实际上调用了OleInitialize,虽然它在内部也调用了CoInitializeEx,但它只能处理单线程,这是AfxOleInit和CoInitialize主要区别:
OleInitialize calls CoInitializeEx internally to initialize the COMlibrary on the current apartment. Because OLE operations are notthread-safe, OleInitialize specifies the concurrency model assingle-thread apartment.
Once the concurrency model for an apartment is set, it cannot bechanged. A call to OleInitialize on an apartment that waspreviously initialized as multithreaded will fail and returnRPC_E_CHANGED_MODE.
应用:
1. CoInitialize仅仅初始化Com,支持多线程。也就是说如果多线程调用Com接口,必须在每个线程中都调用CoInitialize。coinitializeex
2. OleInitialize初始化Com(其实也是调用CoInitializeEx),支持多线程。比CoInitialize多了一下内容:
A) Clipboard
B) Drag and drop
C) Object linking and embedding (OLE)
D) In-place activation
如果不需要这些,用CoInitialize就可以。
3.AfxOleInit是MFC对OleInitialize的封装。貌似不支持多线程,也就是说只能在主进程调用该函数,如果线程需要使用Com必须调用上面的两个来实现初始化。coinitializeex而且MSDN明确标明AfxOleInit不能在MFC的DLL中调用,否则也会造成初始化失败。
4.OleInitialize和OleUninitialize()成对使用;CoInitialize和CoUninitialize成对使用;CoInitializeEx和CoUninitialize成对使用;AfxOleInit()由MFC自动释放。
VC++使用ADO访问ACCESS时,出现_RecordsetPtr Open卡或者_ConnectionPtrExcute卡或者_CommandPtrExcute一直卡住等莫名其妙的情况时,而语法又没有错误时,请确定初始化COM函数。
MFC程序建议使用AfxOleInit()。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-44684-1.html
苏丹红
发动一场战争
还是照顾点他