我是否需要在Delphi的main / VCL线程中调用Coinitialize
在使用ShellExecuteEx
之前?
对于一个线程,是的,但对于VCL线程?
答案 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通过以下方式初始化:
OleInitialize
来自Forms.TApplication.Create
。因此,此调用将针对所有VCL表单应用程序进行,但不适用于服务应用程序。CoInitialize
中的CoInitializeEx
或ComObj.InitComObj
。这已在InitProc
单元的initialization
部分注册为ComObj
。反过来,在项目.dpr文件的代码中调用Application.Initialize
将调用ComObj.InitComObj
。现在,在这些各种COM初始化中,计数的是1和2.在任何标准VCL表单应用程序中,这两个都将在主线程中启动时运行。项目1首先运行,因此首先初始化COM。这是重要的初始化。第2项运行并返回S_FALSE
,表示COM已初始化。
那么,对你的问题:
我是否需要在主/ VCL线程中调用Coinitialize?
不,不。您可以确定COM已在VCL应用程序的主线程中初始化。