gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:35:23 31 4
gpt4 key购买 nike

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 接口(interface)并且其方法之一 (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。

关于windows - SysAllocString/SysFreeString COM 函数需要调用 CoInitialize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40330569/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com