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

标签 windows com

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/

相关文章:

C# - 如何在不使用 winform 的情况下在命令行 exe 中单击鼠标

windows - 在 Windows 中查找将从命令行执行的程序的路径

windows - Windows 上的德尔福

c# - System.Windows.Automation非常慢

c# - “80040154 类未注册”与 ASP.NET 的互操作

c# - 通过 COM 或直接集成到 Java 中使用 .Net 库

windows - 如何在启动程序后关闭CMD

java - Jenkins | "The system cannot find the file specified"

c# - 如何在没有 Winforms 的情况下使用 ClassLibrary 中的 ActiveX 组件

c++ - COM 函数产生不会消失的线程