以下代码不会使应用程序运行。有人可以指出可能是什么问题吗?
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/32 位和 Windows XP SP2/3 32 位。
发现
DxScene 组件固有地使用与 createprocess 过程不兼容的 unicode 字符串。
所以我首先将所需的路径字符串存储在普通字符串中,然后将它们作为参数传递以创建有效的过程。