【问题标题】:SysAllocString/SysFreeString COM functions require CoInitialize to be called?SysAllocString/SysFreeString COM 函数需要调用 CoInitialize?
【发布时间】:2017-03-12 20:25:10
【问题描述】:

COM是否需要初始化才能使用SysAllocString、SysFreeString等BSTR处理函数?

MSDN 说

在调用除 CoGetMalloc 之外的任何库函数之前,您需要在线程上初始化 COM 库

在我看来,BSTR 分配函数使用 IMalloc,因此不需要 COM 初始化?

【问题讨论】:

  • 您在哪里看到 BSTR 分配使用 IMalloc?在 MSDN 中,我发现:“自动化可能会缓存为 BSTR 分配的空间。这会加快 SysAllocString/SysFreeString 序列的速度。但是,这也可能导致 IMallocSpy 将泄漏分配给错误的内存用户,因为它不知道由自动化。”我想知道这个缓存过程是否不需要COM初始化。
  • 在任何情况下,我看不出您可以通过 not 获得什么好处...
  • 我在研究这个问题时在网上某处读到了 IMalloc。好处是我的软件在不同的线程(其中很多)中大量使用了 BSTR,我应该确保它们都调用 Co(Un)Initialize 或者没有必要。
  • 我不认为你的“因此”是有根据的。另外,如果要使用这些功能,为什么不进行初始化。
  • @Medinoc,是的,我知道 - 我是说从 C++ POV 来看,BSTR 没有什么特别之处 - 它没有任何行为,因为它只是 Widechar 指针的别名. OP 说他没有在 COM 上下文中使用它们。我的观点是,在不使用 COM 的情况下谈论 COM 要求很奇怪。

标签: windows com


【解决方案1】:

我找不到官方文档说你可以在不初始化 COM 的情况下调用这些函数,但我可以带你在内存通道上进行一些有趣的观察。

因为 Windows 95 在具有 4 MB RAM 的机器上运行,所以资源管理器非常努力地不加载 ole32.dll。事实上,shell 团队编写了他们自己的迷你版 COM,编写 shell 扩展的人应该只调用 SH* 函数,而不是 Co* 函数,以避免加载真正的 COM/OLE 内容(如果可能)。

This blog post 表示 mini-COM 在 Windows XP 及更高版本中已 100% 消失,但我不确定 shell 在理论上可以处于 mini-COM 模式多远。

当您意识到 Windows 2000 有一个名为 IShellFolder2 的 shell 接口并且它的一个方法 (GetDetailsEx) 返回一个 VARIANT 时,事情变得有趣了。 VARIANT 可以包含 BSTR! IColumnProvider::GetItemData 也返回一个 VARIANT。

根据这些信息,您可以推断出 Windows 2000 可以分配 BSTR,而无需调用 CoInitialize,只需调用 SHGetDesktopFolder 以获取 IShellFolder 并请求作为字符串返回的属性。

然而这里有两个未知数:

  • Windows 2000 是否可以使用 mini-COM?
  • 如果必须返回字符串,shell32.dll 中的 IShellFolder2 实现是否会初始化真正的 COM?

我知道 IShellFolder2 和 IColumnProvider 在资源管理器窗口处于详细信息模式时会涉及到(或者如果它需要工具提示?),因此 shell 似乎不太可能愿意为此加载真正的 COM。

即使我可以确认所有这些,它也不会真正帮助您,因为我认为您的主要目标不是 Windows 2000。

【讨论】:

  • 感谢您的意见。我想我通过实验找到了这个问题的答案。我忘了在这里更新它。简而言之 - 不,如果没有初始化 COM,就不能使用 SysAlloc/FreeString 函数。这样做会导致随机访问冲突,只有在程序运行较长时间(如 3-7 天)时才会发生。
猜你喜欢
  • 2012-12-26
  • 2012-01-08
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多