Do I need to call Coinitialize in the main/VCL thread in Delphi before using ShellExecuteEx?
Coinitialize
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:
CoInitialize
TApplication.Create
Forms.Pas
... if not IsLibrary then FNeedToUninitialize := Succeeded(OleInitialize(nil)); ...