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

时间:2011-07-15 10:14:37

标签: delphi delphi-2009 access-violation createprocess

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

//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,这就是为什么我创建一个具有相同值的新变量。 但它没有任何效果。

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

2 个答案:

答案 0 :(得分:23)

问题出在lpCommandLine参数中。我怀疑你做的是这样的事情:

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

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

相反,你可以这样做:

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

这足以使CmdLine得到可写内存的支持。

仅仅使变量保持字符串非常量是不够的,您需要使备份字符串的内存也可写。将字符串文字分配给字符串变量时,字符串变量指向只读内存。

答案 1 :(得分:11)

这里解释为什么Unicode Delphi需要一种不同的方式来调用CreateProcess:http://edn.embarcadero.com/article/38693

相关问题