以下代码不会使应用程序运行。有人可以指出可能是什么问题吗?
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字符串。
所以我首先将所需的路径字符串存储在普通字符串中,然后将它们作为参数传递给创建有效的进程。
答案 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)), ...)