coinitializeex_coinitializeex 失败_coinitializeex通不过

电脑杂谈  发布时间:2017-05-02 04:01:28  来源:网络整理

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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...