Delphi 2009中CreateProcess函数出现访问冲突问题

17

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

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

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


4
你的代码看起来不完整,请尝试发布完整代码,包括变量类型以及你如何填充传递给CreateProcess函数的参数。 - RRUZ
2
CreateProcess 调用无法提供有用的信息。你会遇到访问冲突错误是因为 CreateProcess 的实现在使用你作为参数传递的指针之一时,成功访问了无效的内存。换句话说,根本问题在于你如何准备参数以及参数的类型。 - Cosmin Prund
-1 (缺乏足够的信息) - Rob Kennedy
1个回答

34

问题出在lpCommandLine参数上。我猜你可能是这样做的:

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

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

相反,您可以这样做:

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

只是让保存字符串的变量不是const并不足够,你还需要确保支持该字符串的内存是可写的。当你将字符串字面量赋值给字符串变量时,该字符串变量指向只读内存。

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


Shellexecute和ShellexecuteEx是否也需要相同的处理,因为我在Delphi XE中调用这些函数时出现了访问冲突错误。我的意图是使用变量路径,而不是字符串字面值来更改路径。 - user30478
1
@user 对于这些函数没有这样的要求。但是只使用ShellExecuteEx,因为它可以正确报告错误。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接