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

前端之家收集整理的这篇文章主要介绍了windows – SysAllocString / SysFreeString COM函数需要调用CoInitialize吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否需要初始化COM才能使用SysAllocString,SysFreeString和其他BSTR处理函数

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?

解决方法

我找不到官方文档,说你可以在不初始化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.

猜你在找的Windows相关文章