次のコードは、アプリケーションを実行するためのものではありません。何が問題なのか指摘してもらえますか?
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が異なる古いアルファビルドでは完全に実行されましたが、新しいUIデザインの実装後は、そうではありません。
GetLastError関数はエラーコード2を返し、システムは指定されたファイルを見つけることができません。
定義されたパスは、アプリケーションによって作成されたinstalldirレジストリエントリから抽出されるため、正しいものです。私もそれを手動で含めようとしましたが、役に立ちませんでした。
'X:\App\PB 0.93\PB.exe'
UIデザインにDxScenev4.42を使用しており、パスはTVxTextBoxから抽出されます。どちらもシステム文字列ですが、定数パスの入力は機能しますが、テキストボックスからは機能しません。CompareStrを使用して両方の文字列を相互に比較した結果、完全に一致しました。
私はWindows764/32ビットとWindowsXPSP2 /332ビットに取り組んでいます。
調査結果
DxSceneコンポーネントは、本質的に、createprocessプロシージャと互換性のないUnicode文字列を使用します。
そこで、必要なパス文字列を最初に通常の文字列に格納し、次にそれらをパラメータとして渡して、機能するプロセスを作成しました。