ShellExecuteEx和Vin线程中的Coinitialize

时间:2013-11-14 17:53:06

标签: delphi delphi-7

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

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

3 个答案:

答案 0 :(得分:5)

无需为Windows窗体应用程序调用{​​{1}}。 这是在主线程中为您完成的。 CoInitialize中更具体的TApplication.Create

Forms.Pas

答案 1 :(得分:2)

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

引用您的MSDN参考:

  

尽管如此,在使用之前始终将COM初始化是一种好习惯   这个功能。

答案 2 :(得分:2)

在RTL / VCL源中,COM通过以下方式初始化:

  1. 致电OleInitialize来自Forms.TApplication.Create。因此,此调用将针对所有VCL表单应用程序进行,但不适用于服务应用程序。
  2. 致电CoInitialize中的CoInitializeExComObj.InitComObj。这已在InitProc单元的initialization部分注册为ComObj。反过来,在项目.dpr文件的代码中调用Application.Initialize将调用ComObj.InitComObj
  3. 在RTL / VCL周围的许多其他位置。包括但不限于Datasnap,ComServ,Soap,System.Win.Sensors,Winapi.DirectShow9。其中一些代码区域比Delphi 7更新。
  4. 现在,在这些各种COM初始化中,计数的是1和2.在任何标准VCL表单应用程序中,这两个都将在主线程中启动时运行。项目1首先运行,因此首先初始化COM。这是重要的初始化。第2项运行并返回S_FALSE,表示COM已初始化。

    那么,对你的问题:

      

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

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