Delphi 在VCL线程中ShellExecuteEx和Coinitialize
我是否需要在Delphi的主/VCL线程中调用Delphi 在VCL线程中ShellExecuteEx和Coinitialize,delphi,delphi-7,Delphi,Delphi 7,我是否需要在Delphi的主/VCL线程中调用Coinitialize 使用前 对于线程,是,但对于VCL线程?如果有疑问,请执行。在这两种情况下,CoInitialize()将返回一个hr:HRESULT,您应该检查它,因为您需要在成功(hr)时执行CoUninitialize(),但在失败(hr)时不执行此操作。失败的结果通常表示它已经被调用 从您的MSDN参考中引用: 尽管如此,在使用COM之前总是初始化COM是一个很好的实践 这个功能 对于Windows窗体应用程序,无需调用CoInit
Coinitialize
使用前
对于线程,是,但对于VCL线程?如果有疑问,请执行。在这两种情况下,
CoInitialize()
将返回一个hr:HRESULT
,您应该检查它,因为您需要在成功(hr)
时执行CoUninitialize()
,但在失败(hr)
时不执行此操作。失败的结果通常表示它已经被调用
从您的MSDN参考中引用:
尽管如此,在使用COM之前总是初始化COM是一个很好的实践
这个功能
对于Windows窗体应用程序,无需调用
CoInitialize
。
这是在主线程中为您完成的。
更具体的t应用程序。在表单中创建。Pas
:
...
if not IsLibrary then
FNeedToUninitialize := Succeeded(OleInitialize(nil));
...
在RTL/VCL源中,COM以以下方式初始化:
通过调用Forms.TApplication.Create
中的OleInitialize
。因此,此调用将针对所有VCL表单应用程序进行,但不适用于服务应用程序
通过调用ComObj.InitComObj
中的CoInitialize
或CoInitializeEx
。在ComObj
单元的initialization
部分中注册为InitProc
。反过来,在project.dpr文件的代码中调用Application.Initialize
,将调用ComObj.InitComObj
在RTL/VCL周围的许多和各种其他位置。包括但不限于Datasnap、ComServ、Soap、System.Win.Sensors、Winapi.DirectShow9。其中一些代码领域比Delphi7更新
现在,在这些不同的COM初始化中,计数的是1和2。在任何标准的VCL表单应用程序中,这两个都将在主线程中启动时运行。项目1首先运行,因此首先初始化COM。这是最重要的初始化。项目2在之后运行,并返回S_FALSE
表示COM已初始化
那么,对于你的问题:
我是否需要在主/VCL线程中调用Coinitialize
不,你没有。您可以确定COM已经在VCL应用程序的主线程中初始化。该问题特别要求消除疑问。。。。这可以通过检查HRESULT轻松完成。这将是错误的方法。“试错永远比不上容易发现和证明的事实。”JensG,MSDN写道:“要在线程上优雅地关闭COM库,每次成功调用CoInitialize
或CoInitializeEx
,包括任何返回S_FALSE
的调用,都必须通过相应的调用CoUninitialize
来平衡,因此必须为CoInitialize[Ex]
@ALZ的S_OK
和S_FALSE
结果调用CoInitialize
:这就是为什么我们应该使用succeed()
和FAILED()
这样的宏/函数的原因。而S_FALSE
是一个成功的代码,因此successed(S_FALSE)
的计算结果为true。初始化不是在应用程序的初始化过程中在InitProc中完成的吗?Initialize?@DavidHeffernan:这是我在源启动代码中找到的唯一与COM相关的初始化(这里是Delphi XE)。我打赌您会在初始过程中找到对CoInitializeEx的调用。@DavidHeffernan:我对源代码做了Grep,如果您发现了其他内容,请随意添加。无论如何,OleInitialize
在内部调用coinitializex
。我在自己的回答中添加了更多细节。我只是想了解更多信息。我对你的回答毫无保留。突出显示的初始化是重要的初始化+1.