在使用之前我需要Coinitialize
在 Delphi 中调用 main/VCL 线程ShellExecuteEx
吗?
对于线程,是的,但是对于 VCL 线程?
在使用之前我需要Coinitialize
在 Delphi 中调用 main/VCL 线程ShellExecuteEx
吗?
对于线程,是的,但是对于 VCL 线程?
无需调用CoInitialize
Windows 窗体应用程序。这是在主线程中为您完成的。更具体TApplication.Create
的Forms.Pas
:
...
if not IsLibrary then
FNeedToUninitialize := Succeeded(OleInitialize(nil));
...
如果有疑问,就去做。在任何一种情况下,CoInitialize()
都会返回hr : HRESULT
您应该检查的 a ,因为您需要CoUninitialize()
on SUCCEEDED(hr)
,而不是 when FAILED(hr)
。失败的结果通常表明它已经被调用。
从您的 MSDN 参考引用:
尽管如此,在使用此函数之前始终初始化 COM 是一种很好的做法。
在 RTL/VCL 源码中,COM 的初始化方式如下:
OleInitialize
来自Forms.TApplication.Create
。因此,将对所有 VCL 表单应用程序进行此调用,但不会针对服务应用程序进行调用。CoInitialize
或CoInitializeEx
在ComObj.InitComObj
. InitProc
这在单元的initialization
部分中注册为一个ComObj
。反过来,对Application.Initialize
项目 .dpr 文件代码中的调用将调用ComObj.InitComObj
.现在,在这些不同的 COM 初始化中,计数的是 1 和 2。在任何标准的 VCL 表单应用程序中,这两者都将在启动时在主线程中运行。第 1 项首先运行,因此首先初始化 COM。这才是最重要的初始化。项目 2 在之后运行并返回S_FALSE
意味着 COM 已经初始化。
所以,对于你的问题:
我需要在主/VCL 线程中调用 Coinitialize 吗?
你不可以。您可以确定 COM 已经在 VCL 应用程序的主线程中初始化。