Create_Unicode_Environment
- это флаг создания процесса , предназначенный для использования в параметре dwCreationFlags
CreateFile
. Это не флаг для использования в записи TStartupInfo
. Функции API могут потерпеть неудачу, если вы дадите им значения флагов, которые они не понимают, и они могут делать странные вещи, если вы дадите им значения флагов, которые означают нечто иное, чем вы ожидали.
Вы объявляете буфер 256 Char
с; Напомним, что Char
в Delphi 2009 - это 2-байтовый тип Unicode. Затем вы вызываете ReadFile
и говорите ему, что буфер имеет длину 255 байт вместо действительного значения 512. Когда в документации говорится, что значением является число байтов, примите это как сигнал для использования функция SizeOf
.
Поскольку ReadFile
читает байты, было бы неплохо объявить ваш буферный массив как массив элементов байтового размера, таких как AnsiChar
. Таким образом, когда вы устанавливаете Buffer[BytesRead]
, вы не будете включать вдвое больше данных, которые вы фактически читаете.
Unicode-версия CreateProcess
может изменять аргумент командной строки. Вы должны убедиться, что строка, передаваемая этому параметру, имеет счетчик ссылок 1. Вызовите UniqueString(DosApp)
, прежде чем вызывать CreateProcess
.
При сбое функции API вы, конечно, захотите узнать, почему. Не просто составляют причину. Используйте предоставленные функции, такие как Win32Check
и RaiseLastOSError
. По крайней мере, позвоните GetLastError
, как MSDN говорит вам. Не бросайте универсальный тип исключения, если более конкретный тип доступен.