Delphi 2009中函数CreateProcess中的访问冲突

Access Violation in function CreateProcess in Delphi 2009

在我的程序中,我有以下代码:

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

而且我不断收到访问冲突错误。
顺便说一句,在Delphi7中,相同的代码可以完美地工作。
我已经阅读了MSDN,发现Delphi中的CreateProcess函数可以修改第二个参数。
最初是const,这就是为什么我创建一个具有相同值的新变量的原因。
但这没有效果。

问题是:为什么此代码不起作用?


问题出在lpCommandLine参数中。 我怀疑您正在执行以下操作:

1
2
3
4
5
var
  CmdLine: string;
...
CmdLine := 'notepad.exe';
CreateProcess(nil, PChar(CmdLine), ...)

由于CmdLine是不可写的内存,因此会导致访问冲突。 该字符串是存储在只读存储器中的常量字符串。

相反,您可以这样做:

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

这足以使CmdLine被可写内存支持。

仅使包含字符串的变量为非常量是不够的,还需要使支持字符串的内存也可写。 当您将字符串文字分配给字符串变量时,字符串变量指向只读存储器。


这里解释了为什么Unicode Delphi要求使用不同的方法来调用CreateProcess:http://edn.embarcadero.com/article/38693