5

在使用之前我需要Coinitialize在 Delphi 中调用 main/VCL 线程ShellExecuteEx吗?

对于线程,是的,但是对于 VCL 线程?

4

3 回答 3

5

无需调用CoInitializeWindows 窗体应用程序。这是在主线程中为您完成的。更具体TApplication.CreateForms.Pas

...
if not IsLibrary then
 FNeedToUninitialize := Succeeded(OleInitialize(nil));
...
于 2013-11-14T18:07:50.197 回答
3

如果有疑问,就去做。在任何一种情况下,CoInitialize()都会返回hr : HRESULT您应该检查的 a ,因为您需要CoUninitialize()on SUCCEEDED(hr),而不是 when FAILED(hr)。失败的结果通常表明它已经被调用。

从您的 MSDN 参考引用:

尽管如此,在使用此函数之前始终初始化 COM 是一种很好的做法。

于 2013-11-14T18:07:02.567 回答
3

在 RTL/VCL 源码中,COM 的初始化方式如下:

  1. 通过调用OleInitialize来自Forms.TApplication.Create。因此,将对所有 VCL 表单应用程序进行此调用,但不会针对服务应用程序进行调用。
  2. 通过调用CoInitializeCoInitializeExComObj.InitComObj. InitProc这在单元的initialization部分中注册为一个ComObj。反过来,对Application.Initialize项目 .dpr 文件代码中的调用将调用ComObj.InitComObj.
  3. 在 RTL/VCL 周围的许多其他位置。包括但不限于 Datasnap、ComServ、Soap、System.Win.Sensors、Winapi.DirectShow9。其中一些代码领域比 Delphi 7 更新。

现在,在这些不同的 COM 初始化中,计数的是 1 和 2。在任何标准的 VCL 表单应用程序中,这两者都将在启动时在主线程中运行。第 1 项首先运行,因此首先初始化 COM。这才是最重要的初始化。项目 2 在之后运行并返回S_FALSE意味着 COM 已经初始化。

所以,对于你的问题:

我需要在主/VCL 线程中调用 Coinitialize 吗?

你不可以。您可以确定 COM 已经在 VCL 应用程序的主线程中初始化。

于 2013-11-16T13:28:30.940 回答