【问题标题】:what is the differnce between coinitialize and coinitializeex?coinitialize 和coinitializeex 有什么区别?
【发布时间】:2018-03-06 06:27:13
【问题描述】:
coinitialize(Null);
    {
        _In_opt_ LPVOID pvReserved, //parameters
        _In_     DWORD  dwCoIn
Coinitializeex(Null);
    {
       _In_opt_ LPVOID pvReserved,
       _In_     DWORD  dwCoInit
    }

你能简单解释一下吗?

【问题讨论】:

  • 文档中清楚地解释了差异。 CoInitialize() 没有dwCoInit 参数,它只将调用线程初始化为COINIT_APARTMENTTHREADED。而CoInitializeEx() 允许您选择所需的初始化选项。
  • 可以在同一个文件或程序中使用这两个函数。我的问题是他们调用coinitialize(NULL)。之后他们调用coinitializeex(NULL,Coinit_multithreaded)。第二个是用代码退出0.错误设置后无法设置模式。如果我命令coinitialize(null)它工作正常。你能帮助我吗。可能是什么是proplrm
  • win32com 标记在这里是错误的,因为它用于关于 Python 模块的问题。
  • @PandyaChinna 再次阅读文档,对此进行了详细介绍。 idownvotedbecau.se/noresearch

标签: c++ winapi com


【解决方案1】:

打电话

CoInitialize(NULL);

相当于调用

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

因此,如果您的应用程序首先调用CoInitialize(NULL) 并随后(在同一个线程中)调用CoInitializeEx(NULL, COINIT_MULTITHREADED),这将相当于

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CoInitializeEx(NULL, COINIT_MULTITHREADED);

documentation 状态

通常,COM 库仅在线程上初始化一次。在同一线程上对 CoInitialize 或 CoInitializeEx 的后续调用将成功,只要它们不尝试更改并发模型,但将返回 S_FALSE。

在您的情况下,您正在尝试更改并发模型,因此调用将失败。

如果在调用CoInitializeEx() 之前没有使用COM,并且您无法删除之前对CoInitialize() 的调用,您可以尝试在两者之间调用CoUninitialize()

另请注意,COM 初始化是按线程进行的,因此使用不同的线程可能会有另一种解决方法。

如果您可以将呼叫更改为CoInitialize(),只需将其替换为

CoInitializeEx(NULL, COINIT_MULTITHREADED);

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多