在使用之前我需要Coinitialize在 Delphi 中调用 main/VCL 线程ShellExecuteEx吗?
对于线程,是的,但是对于 VCL 线程?
在使用之前我需要Coinitialize在 Delphi 中调用 main/VCL 线程ShellExecuteEx吗?
对于线程,是的,但是对于 VCL 线程?
无需调用CoInitializeWindows 窗体应用程序。这是在主线程中为您完成的。更具体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 应用程序的主线程中初始化。