Asegurate de leer la documentación
La funcion
CopyFile devuelve True o False segun la operación tuvo éxito o no
Tu error es que tu codigo sigue operando sin chequear el valor de retorno. Las funciones de la API de Windows no suelen elevar excepciones; es por esto que la mayoria retorna el Boolean
Luego, existe el método
RaiseLastOSError definido en la unidad
SysUtils que eleva una excepción con el mensaje y código de la última excepción que se generó al llamar una llamada a la API de Windows
Podrías refactorizar tu código de la siguiente manera:
Código Delphi
[-]
if not CopyFile(...) then
RaiseLastOSError;
Otra forma de hacerlo en mi opinión mas limpia es usando la funcion
Win32Check, también de la unidad
SysUtils
Win32Check chequea el valor de retorno de la función en cuestión, y si es False (hubo un error) invoca a
RaiseLastOSError
Código Delphi
[-]
if Win32Check(CopyFile(...)) then
begin
end;