Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在VCL线程中ShellExecuteEx和Coinitialize_Delphi_Delphi 7 - Fatal编程技术网

Delphi 在VCL线程中ShellExecuteEx和Coinitialize

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

我是否需要在Delphi的主/VCL线程中调用
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.