Delphi 2009 中函数 CreateProcess 的访问冲突

Posted

技术标签:

【中文标题】Delphi 2009 中函数 CreateProcess 的访问冲突【英文标题】:Access Violation in function CreateProcess in Delphi 2009 【发布时间】:2011-07-15 10:14:37 【问题描述】:

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

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

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

【问题讨论】:

您的代码看起来不完整,请尝试发布您正在使用的完整代码,包括变量类型以及您如何填充传递给CreateProcess 函数的参数。 CreateProcess 调用无法告诉我们任何有用的信息。您会遇到访问冲突,因为 CreateProcess 的实现设法使用您作为参数传递的指针之一访问无效内存。换句话说,根本问题在于您如何准备参数以及参数的类型。 -1 表示信息不足 【参考方案1】:

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

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

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

您可以这样做:

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

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

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

【讨论】:

Shellexecute 和 shellexecuteEx 是否也需要相同的处理,因为我在 Delphi XE 中遇到这些函数调用的访问冲突错误。我确实有一个可变路径意图,即不是字符串文字而是改变路径。 @user 对这些功能没有这样的要求。只使用 ShellExecuteEx,因为它会正确报告错误。【参考方案2】:

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

【讨论】:

提供的链接中的此答案与已接受答案的解决方案完全相同,请查找“传入引用计数为 -1 的字符串”。只是为了表明投票者不知道他在做什么......

以上是关于Delphi 2009 中函数 CreateProcess 的访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

在 Delphi 2009 的 Rave Reports 中显示 unicode 文本

WinInet 帖子的简单包装函数(在 Delphi 中)

在 Delphi 2009 中显示 PDF 文件的最佳方法是啥[关闭]

关于delphi字符长度的问题?

DELPHI 2009 中的 .NET 组件

像 Windows 一样显示字节数的 Delphi 函数