CreateProcess过程无效

时间:2012-08-14 10:20:02

标签: delphi winapi

以下代码不会使应用程序运行。有人可以指出可能是什么问题吗?

procedure TTestForm1.DR_DBA_StartAppButtonClick(Sender: TObject);
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  filename : String;
  sa : TSecurityAttributes;
  sd : TSecurityDescriptor;

begin

  InitializeSecurityDescriptor( @sd, SECURITY_DESCRIPTOR_REVISION );
  SetSecurityDescriptorDacl( @sd, true, nil, false);

  sa.nLength := sizeof( sa );
  sa.lpSecurityDescriptor := @sd;
  sa.bInheritHandle := true;

  // start app process
  ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
  StartInfo.cb := SizeOf(TStartupInfo);

  if not
    CreateProcess (nil, PChar(SF_AppPathBox.Text), @sa, @sa, False,
    PROCESS_VM_WRITE or PROCESS_VM_OPERATION, nil, nil, StartInfo, ProcInfo) then
  begin

    showmessage ('Cannot Start App');
    exit;

  end;

end;

对于具有不同UI的较旧的alpha版本,此代码运行良好,但现在在实施新的UI设计之后,它没有。

GetLastError函数返回错误代码2,系统找不到指定的文件。

定义的路径是正确的,因为它是从应用程序生成的installdir注册表项中提取的。我也试过手动包括但无济于事。

'X:\App\PB 0.93\PB.exe'

我正在使用DxScene v4.42进行UI设计,路径是从TVxTextBox中提取的。尽管两者都是系统字符串,但放入常量路径但不能从文本框中起作用。我通过CompareStr将两个字符串相互比较,结果完全匹配。

我正在使用Windows 7 64 / 32bit和Windows XP SP2 / 3 32位。

调查结果

DxScene组件本身使用与createprocess过程不兼容的unicode字符串。

所以我首先将所需的路径字符串存储在普通字符串中,然后将它们作为参数传递给创建有效的进程。

1 个答案:

答案 0 :(得分:3)

您似乎在Unicode和Ansi文本之间存在不匹配。您正在使用使用Unicode的UI控件,但正在使用Ansi Delphi进行编译。因此,您将16位字符数组传递给需要8位编码文本的函数。这解释了报告的错误代码。

代码可能适用于原始开发人员,因为他们使用的是现代Unicode Delphi。如果是这种情况,那么您最好的做法是使用最初编译它的Delphi版本编译代码。

如果您必须使用Ansi Delphi,那么您可以通过传递

来修复您的代码
PChar(string(SF_AppPathBox.Text))

到CreateProcess。这将具有从Unicode转换为Ansi的效果。

您也可以像这样调用Unicode版本的CreateProcess:

CreateProcessW(..., PWideChar(WideString(SF_AppPathBox.Text)), ...)