- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
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 并请求一个以字符串形式返回的属性。
然而这里有两个未知数:
我知道当资源管理器窗口处于详细信息模式时(或者如果它需要工具提示?)会涉及 IShellFolder2 和 IColumnProvider,因此 shell 似乎不太可能愿意为此加载真正的 COM。
即使我可以确认所有这些,也不会真正帮助您,因为我假设您的主要目标不是 Windows 2000。
关于windows - SysAllocString/SysFreeString COM 函数需要调用 CoInitialize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40330569/
我正在尝试在线程中使用 COM 接口(interface)。根据我所读到的内容,我必须在每个线程中调用 CoInitialize/CoUninitialize 。 虽然这工作正常: procedure
我正在编写一个控制台应用程序,该应用程序将为名为 Client.exe 的主应用程序创建防火墙异常(exception),该应用程序通过 FTP 将一些文档上传到我们的服务器。我从Delphi 7 W
我正在 Delphi XE2 中构建一个多线程 Windows 服务应用程序,它使用 ADO 数据库组件连接到 SQL Server。我用过CoInitialize(nil);在内部线程之前很多次,但
假设我的应用程序在启动时调用 CoInitialize,并在存在之前调用 CoUninitialize。 假设我的应用程序使用了一个第三方组件并执行类似的操作,这会导致某种失败吗? 当调用已经提交时,
假设我的应用程序在启动时调用 CoInitialize,并在存在之前调用 CoUninitialize。 假设我的应用程序使用了一个第三方组件并执行类似的操作,这会导致某种失败吗? 当 CoIniti
这是我的 ThorDetectorSwitch.cpp 文件构造函数的 C++ 代码: ThorDetectorSwitch::ThorDetectorSwitch() : _mcSwitch(__u
自创建以来已经有 16 年了,我仍然不知道为什么 CoInitialize 中有一个保留参数。方法。有谁知道(或能够做出明智的猜测)添加此参数的原因以及预期用途是什么? 最佳答案 这实际上不是为了将来
我使用 UniDac 组件连接到 PostgreSQL。我的查询正在单独的线程中运行。现在,当我在线程中使用 CoInitialize 时,我收到以下编译器错误: - [DCC Error] QryT
在具有ADO数据库连接的多线程环境中,我想知道CoInitialize是否已被调用。我该如何检查这个? 最佳答案 通常情况下,您不应该执行此检查,而只需调用 CoInitialize/CoUnInit
下面的代码,源自https://learn.microsoft.com/en-us/windows/desktop/shell/folder-info#determining-an-objects-p
我有一个 .NET 应用程序,它使用 COM Interop 使用 COM 组件,组件实例化自身,接口(interface)指针在 API cal 中返回到 .net 包装器,稍后在应用程序流程中进行
我在 Delphi 程序的线程内使用 TIdHttp 和 TXMLDocument。现在我想知道: 这些类是否使用 COM 对象,因此我需要在此线程中调用 CoInitialize 和 CoUnini
onecore\com\combase\objact\objact.cxx(812)\combase.dll!00007FF8BD322169: (caller: 00007FF8BD320F78)
我正在学习 Python 中的多线程。我正在查看在线示例,并尝试为远程连接到远程计算机的 WMI 模块尝试多线程。但是,当我使用pythoncom.CoInitialize()时,它给我一个错误,指出
-我的问题 我得到 CoInitialize has not been called exption. -我的项目结构 这是我的问题。我有一个用 C# 开发的 COM dll,MCLWrapper.d
为了学习多线程,我在 COM 线程 (TRemoteDataModule) 中创建了一个线程。 这是我的组件工厂: TComponentFactory.Create(ComServer, TServe
我正在开发一个 UI 应用程序,它会一路创建一个 COM 对象。 问题是,我想将这个 COM 对象完全“移动”到另一个线程上。 我要做的是: 创建我想将对象移动到的新线程(使用 CreateThrea
我有一个 XE2 DataSnap 服务器(Windows 服务),它在其方法中使用第 3 方进程外 COM 组件。作为 COM,我知道它需要在语句周围使用 CoInitializeEx 和 CoUn
我有一个使用 C++ DLL 的 C# Windows 窗体应用程序。在 DLL 中,我初始化 COM: auto hResult = CoInitialize(NULL); // Initializ
COM是否需要初始化才能使用SysAllocString、SysFreeString等BSTR处理函数? MSDN 说 You need to initialize the COM library o
我是一名优秀的程序员,十分优秀!