Le funzioni API generalmente si aspettano valori di tipo PAnsiChar, cioè puntatori a stringhe "null terminated" di caratteri di tipo ANSI (di cui esiste la controparte PWideChar, riferita a funzioni che lavorano su stringhe Unicode); il tipo generico PChar è un alias del tipo genericamente più utilizzato al momento PAnsiChar precedentemente descritto.

Il tipo String di Delphi ha una rappresentazione binaria particolare in memoria che consente a Delphi di gestire automaticamente il tipo, contandone i riferimenti e svolgendo altre operazioni che rientrano nell'ottica del "memory management" di quel tipo di dato e di un altro insieme ristretto di tipi sottoposti alla stessa gestione.

Quando una funzione API richiede un PChar, cioè un PAnsiChar, è necessario quindi provvedere alla conversione del tipo String in quel tipo di dato richiesto dalla funzione.

La bella notizia è che Delphi è in grado di svolgere autonomamente questa conversione con una semplice operazione di "casting".

Riprendendo il tuo esempio, è sufficiente scrivere

codice:
  MioFile := ExtractFilePath(Application.ExeName) + '\Lettera.doc';
  ShellExecute(0, nil, PChar(MioFile), nil, nil, 1);
e il gioco è fatto.

Delphi provvede automaticamente a creare un buffer "al volo" compatibile con il tipo che la funzione API si aspetta, e passa il puntatore PChar alla funzione che lo utilizza per i propri scopi.

Al di là della semplicità della soluzione, c'era comunque posto per un po' di "background" sui dettagli implementativi operati da Delphi, tanto per sapere in quale modo si ottengono certe "magie"...

Ciao!