As stated in my answer to a similar question:
In the RTL/VCL source, COM is initialized in the following ways:
- By a call to
OleInitialize
made from Forms.TApplication.Create
. So this call will be made for all VCL forms applications, but not, for
example, for service applications.
- By a call to
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
.
- In many and various other locations around the RTL/VCL. Including, but not limited to, Datasnap, ComServ, Soap, System.Win.Sensors,
Winapi.DirectShow9. Some of these areas of code are more recent than
Delphi 7.
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.
All VCL applications include the Forms
unit and so you can be sure thaat COM is initialized in the main VCL thread. For other threads you need to initialize COM if necessary.
You must never initialize COM in control or more generally a thread that you are not in control of. If you do so then your initialization may conflict with the apartment type specified by the owner of the thread.