SysAllocString / SysFreeString COM函数需要调用CoInitialize吗?

时间:2016-10-30 15:21:19

标签: windows com

是否需要初始化COM才能使用SysAllocString,SysFreeString和其他BSTR处理函数?

MSDN说

  

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

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

1 个答案:

答案 0 :(得分:0)

我找不到官方文档说明你可以在没有初始化COM的情况下调用这些函数,但是我可以带你去记忆路径上进行一些可爱的观察。

由于Windows 95在具有4 MB RAM的计算机上运行,​​因此Explorer很难尝试不加载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可以在不必调用CoInitialize的情况下分配BSTR,只需调用SHGetDesktopFolder获取IShellFolder并请求以字符串形式返回的属性。

然而,这里有两个未知数:

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

我知道当资源管理器窗口处于详细模式时(或者如果它需要工具提示?),IShellFolder2和IColumnProvider会参与其中,所以shell似乎不太愿意为此加载真正的COM。

即使我能确认所有这一切也不会对你有所帮助,因为我认为你的主要目标不是Windows 2000。