-1

次のコードは、アプリケーションを実行するためのものではありません。何が問題なのか指摘してもらえますか?

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文字列を使用します。

そこで、必要なパス文字列を最初に通常の文字列に格納し、次にそれらをパラメータとして渡して、機能するプロセスを作成しました。

4

1 に答える 1

3

UnicodeとAnsiテキストの間に不一致があるようです。Unicodeを使用するUIコントロールを使用していますが、AnsiDelphiでコンパイルしています。したがって、16ビット文字の配列を8ビットでエンコードされたテキストを期待する関数に渡します。これは、報告されるエラーコードを説明しています。

元の開発者は最新のUnicodeDelphiを使用していたため、コードが機能した可能性があります。その場合、最善の行動は、コードが最初にコンパイルされたバージョンのDelphiでコードをコンパイルすることです。

Ansi Delphiを使用する必要がある場合は、次のパスを使用してコードを修正できます。

PChar(string(SF_AppPathBox.Text))

CreateProcessに。これは、UnicodeからAnsiに変換する効果があります。

または、次のようにUnicodeバージョンのCreateProcessを呼び出すこともできます。

CreateProcessW(..., PWideChar(WideString(SF_AppPathBox.Text)), ...)
于 2012-08-15T10:29:42.800 に答える