私は現在、アプリケーションが提供する情報が必要なため、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が作業ディレクトリに関連しているという追加のエラーがあったので、その答えを受け入れます。助けてくれてありがとう。