MSDN说
You need to initialize the COM library on a thread before you call any of the library functions except CoGetMalloc
在我看来,BSTR分配函数使用IMalloc,因此不需要COM init?
解决方法
因为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.