1

私は現在、アプリケーションが提供する情報が必要なため、CreateProcessW()代わりに使用するようにアプリケーションを変換しています。Runtime.exec()ただし、CreateProcessW() の呼び出しはエラー コード 5 (ACCESS DENIED) で失敗します。同じケースで Runtime.exec() が正常に実行されるため、これが発生する理由を見つけることができませんでした。

私のエラーは、次のコード スニペット、メソッド呼び出し、および jna インターフェイスのいずれかにある可能性があります。

public ProcessInfo createProcess(String dir, String name){
            ProcessInfo pi = new ProcessInfo();
            StartupInfo start = new StartupInfo();
            mem.CreateProcessW(new WString(name),
                    null,
                    null,
                    null,
                    false,
                    0,
                    null,
                    new WString(dir),
                    start.getPointer(),
                    pi.getPointer());
            return pi;
        }

私の CreateProcessW の定義

boolean CreateProcessW(WString apname,
                    char[] comline,
                    Pointer p,
                    Pointer p2,
                    boolean inheritHandles,
                    int createFlags,
                    String environment,
                    WString directory,
                    Pointer startinf,
                    Pointer processInfo);

追加情報:

  • Runtime.exec() は指定された文字列で成功します
  • StartupInfo のサイズが設定されている
  • 使用したテスト環境: WinXP SP3 および Netbeans 6.9.1

使用されるパラメーターの例:

  • お名前: moviemk.exe
  • ディレクトリ: C:\Programme\Movie Maker\

異なるパスでもテストされているため、空白の問題ではありません

ありがとう

アップデート:

結局のところ、エラーは、呼び出しコードが作業ディレクトリとexeパスをチェックした後に切り替えたことが原因でした。結果としてアクセスが拒否されたため、実際には少なくともexeが見つかったと思いました。その問題に対処するために IllegalArgumentException を追加します。

exeが作業ディレクトリに関連しているという追加のエラーがあったので、その答えを受け入れます。助けてくれてありがとう。

4

3 に答える 3

1

CreateProcessWの最初のパラメータは、フルパスまたは現在のディレクトリからの相対パスのいずれかである必要があります。作業ディレクトリパラメータからの相対パスにすることはできません。これは、期待していることのようです。

C:\Programme\Movie Maker\moviemk.exe名前パラメータとして渡してみてください

于 2011-01-28T18:24:39.310 に答える
1

CreateProcess関数の最初のパラメーターlpApplicationNameは通常どおりに使用され、2 番目のパラメーターには、開始するプログラム名で始まるコマンド ラインが含まれている必要があります。NULLlpCommandLine

CreateProcessW現在呼び出しで使用している第 1 パラメーターと第 2 パラメーターを切り替えるには、フライするだけです。

于 2011-01-28T15:26:20.497 に答える
0

あなたが入力しているフルパスは何ですか?Runtime.exec内部で引数を引用している可能性があり、この状況に遭遇している可能性があります。

http://support.microsoft.com/kb/179147

おそらく、存在するパスにプレフィックスがあり、フォルダまたは他のファイルを実行しようとしているのでしょうか。

パス全体を引用符で囲んでみて、それが役立つかどうかを確認してください。

于 2011-01-28T17:07:16.757 に答える