Нарушение доступа в функции CreateProcess в Delphi 2009 - PullRequest
10 голосов
/ 15 июля 2011

В моей программе следующий код:

//Code
 if not CreateProcess(nil, NonConstCmd, nil, nil, True, NORMAL_PRIORITY_CLASS or
    CREATE_NEW_PROCESS_GROUP, nil, PCh, SI, P) then
//Code

И я продолжаю получать сообщение об ошибке Access AccessКстати, в Delphi7 тот же код работает отлично.Я прочитал MSDN и обнаружил, что функция CreateProcess в Delphi может изменить второй аргумент.Изначально это было const, поэтому я создаю новую переменную с тем же значением.Но это не дает никакого эффекта.

Вопрос: почему этот код не работает?

Ответы [ 2 ]

23 голосов
/ 15 июля 2011

Проблема в параметре lpCommandLine.Я подозреваю, что вы делаете что-то вроде этого:

var
  CmdLine: string;
...
CmdLine := 'notepad.exe';
CreateProcess(nil, PChar(CmdLine), ...)

Это приводит к нарушению доступа, поскольку CmdLine не является доступной для записи памятью.Строка является константной строкой, хранящейся в постоянной памяти.

Вместо этого вы можете сделать это:

CmdLine := 'notepad.exe';
UniqueString(CmdLine);
CreateProcess(nil, PChar(CmdLine), ...)

Этого достаточно, чтобы CmdLine поддерживалось записываемой памятью.

Недостаточно просто сделать переменную, содержащую строку неконстантной, необходимо также сделать память, поддерживающую строку, доступной для записи.Когда вы присваиваете строковый литерал строковой переменной, строковая переменная указывает на постоянную память.

11 голосов
/ 15 июля 2011

Вот объяснение, почему Unicode Delphi требует другого способа вызова CreateProcess: http://edn.embarcadero.com/article/38693

...