Do I need to call Coinitialize
in the main/VCL thread in Delphi
before using ShellExecuteEx
?
For a thread, yes but for the VCL thread ?
Do I need to call Coinitialize
in the main/VCL thread in Delphi
before using ShellExecuteEx
?
For a thread, yes but for the VCL thread ?
No need to call CoInitialize
for Windows Forms Applications.
This is done for you in the main thread.
More specific TApplication.Create
in Forms.Pas
:
...
if not IsLibrary then
FNeedToUninitialize := Succeeded(OleInitialize(nil));
...
OleInitialize
calls CoInitializeEx
internally. –
Mackoff If in doubt, do it. In either case, CoInitialize()
will return a hr : HRESULT
which you should check, because you need to CoUninitialize()
on SUCCEEDED(hr)
, but not when FAILED(hr)
. A failed result usually indicates that it already has been called.
Cited from your MSDN ref:
Nonetheless, it is good practice to always initalize COM before using this function.
CoInitialize
or CoInitializeEx
, including any call that returns S_FALSE
, must be balanced by a corresponding call to CoUninitialize
", so that CoUninitialize
must be called for both S_OK
and S_FALSE
results of CoInitialize[Ex]
–
Cilo SUCCEEDED()
and FAILED()
which you should use. And S_FALSE
is an success code, thus SUCCEEDED(S_FALSE)
evaluates to true. –
Lazarolazaruk SUCCEEDED(S_FALSE)
evaluates to true." Live a century - learn a century! :) –
Cilo In the RTL/VCL source, COM is initialized in the following ways:
OleInitialize
made from Forms.TApplication.Create
. So this call will be made for all VCL forms applications, but not, for example, for service applications.CoInitialize
or CoInitializeEx
in ComObj.InitComObj
. This is registered as an InitProc
in the initialization
section of the ComObj
unit. In turn, the call to Application.Initialize
in your project .dpr file's code will invoke ComObj.InitComObj
.Now, of these various COM initializations, the ones that count are 1 and 2. In any standard VCL forms application, both of these will run at startup in the main thread. Item 1 runs first and so gets to initialize COM first. That's the initialization that counts. Item 2 runs after and returns S_FALSE
meaning that COM was already initialized.
So, to your question:
Do I need to call Coinitialize in the main/VCL thread?
No you do not. You can be sure that COM has already been initialized in a VCL application's main thread.
© 2022 - 2024 — McMap. All rights reserved.