Hola,
Primero que nada (aunque parezca simple) comprueba que existe el archivo en cuestión. Por otro lado comprueba el resultado de la función "ShellExecute", y llegado el caso comprueba también el último error con la función "GetLastError()".
Código Delphi
[-]
if ShellExecute() <= 32 then
begin
ShowMessage( SysErrorMessage( GetLastError() ) );
end;
Edito: Tal vez me pasé de listo. Mirando la ayuda no veo referencia a que pueda usarse "GetLastError()"... y sí a que la función puede retornar un entero menor o igual que 32 en caso de éxito, o uno de los siguientes enteros/constantes en caso de error:
Código:
0 The operating system is out of memory or resources.
ERROR_FILE_NOT_FOUND The specified file was not found.
ERROR_PATH_NOT_FOUND The specified path was not found.
ERROR_BAD_FORMAT The .exe file is invalid (non-Microsoft Win32 .exe or error in .exe image).
SE_ERR_ACCESSDENIED The operating system denied access to the specified file.
SE_ERR_ASSOCINCOMPLETE The file name association is incomplete or invalid.
SE_ERR_DDEBUSY The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed.
SE_ERR_DDEFAIL The DDE transaction failed.
SE_ERR_DDETIMEOUT The DDE transaction could not be completed because the request timed out.
SE_ERR_DLLNOTFOUND The specified DLL was not found.
SE_ERR_FNF The specified file was not found.
SE_ERR_NOASSOC There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable.
SE_ERR_OOM There was not enough memory to complete the operation.
SE_ERR_PNF The specified path was not found.
SE_ERR_SHARE A sharing violation occurred.