Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi CreateProcess过程不工作_Delphi_Winapi - Fatal编程技术网

Delphi CreateProcess过程不工作

Delphi CreateProcess过程不工作,delphi,winapi,Delphi,Winapi,下面的代码不能使应用程序运行。有人能指出问题出在哪里吗 procedure TTestForm1.DR_DBA_StartAppButtonClick(Sender: TObject); var StartInfo: TStartupInfo; ProcInfo: TProcessInformation; filename : String; sa : TSecurityAttributes; sd : TSecurityDescriptor; begin Initi

下面的代码不能使应用程序运行。有人能指出问题出在哪里吗

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设计,路径是从TVxtXtbox中提取的。输入常量路径有效,但不能从文本框中输入,尽管两者都是系统字符串。我已经通过CompareStr将这两个字符串进行了比较,结果是完全匹配

我正在Windows 7 64/32位和Windows XP SP2/3 32位上工作

调查结果 DxScene组件固有地使用unicode字符串,这与createprocess过程不兼容


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

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

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

如果必须使用Ansi Delphi,则可以通过传递

PChar(string(SF_AppPathBox.Text))
创建进程。这将产生从Unicode转换为Ansi的效果

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

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

也许你可以告诉我们至少错误代码,数字和文本,以及它们开始发生的确切路线。请参阅MSDN GetLastError,SysInternals进程监视器欢迎使用StackOverflow。“不允许”是什么意思?错误代码或消息?“不知为什么它不是”是什么意思?我们无法从这里看到您的屏幕或阅读您的想法,因此您有必要向我们提供这些详细信息。请编辑您的问题以添加更具体的详细信息,以便我们可以帮助您解决问题。:-)@肯·怀特:对一张新海报的有益评论。@David Hefferman:“当API调用失败时调用GetLastError。”这将是一个很好的评论。“其他三句话都没用。@马克斯,也许我应该什么都不说。但是,如果开发人员不知道如何调用GetLastError,那么我们中的任何人都无法提供帮助。虽然现在,我正在考虑迁移到firemonkey,因为它与DxScene相似,而且D2007非常有缺陷。XE2比2007好得多。但请记住,FMX目前是臭虫之城。我的建议是等待XE3,并希望它有一个较少的故障FMX。