JavaからC++のexeファイルを起動し値を渡す方法と、Javaで外部ファイルを起動した時の設定についての疑問

このQ&Aのポイント
  • JavaからC++で作成したexeファイルの特定の変数に値を渡す方法について教えてください。
  • Javaで外部ファイルを起動した場合、なぜ設定やお気に入りが初期化されているのでしょうか。
  • 質問にお答えします。JavaからC++で作成したexeファイルの特定の変数に値を渡す方法や、Javaで外部ファイルを起動した際に設定が初期化される理由についてご説明します。
回答を見る
  • ベストアンサー

javaからexeの起動、値渡し(?)について。

1. 短縮したソースで申し訳ないのですが、JavaからC++で作成したexeファイルの、 int secに、javaでexe起動時に任意の数値を渡したいのですが、 何か良い方法はありますでしょうか? 2. またJavaで、外部ファイルを起動した時に、例えばFirefox等の場合、 自身の設定や、お気に入りが全くない状態で起動するのは何故でしょうか? 回答いただければと思います。どうぞよろしくお願いいたします。 [java] ProcessBuilder pb=new ProcessBuilder("C:\\Users\\Super\\Desktop\\cplus.exe", "30"); try { Process p=pb.start(); int ret=p.waitFor(); System.out.println("process exited with value : " + ret); } catch (IOException ioe) { } catch (InterruptedException inte) { } [C++ win32api] #include <windows.h> int main() { int sec=0; HANDLE hTimer; BOOL ret=FALSE; DWORD err=0; //以下はタイマー作成 }

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#161640
noname#161640
回答No.2

ああっ。投稿した後で気がついた。Java内から起動するプロセスに値を渡すのですね。勘違いしていました。 ProcessBuilderの際に引数にパラメータを指定して、C側で受け取るようにはできないのでしょうか。C側でmain(int argc, char *argv[])として受け取るのではまずいんですか?

その他の回答 (1)

noname#161640
noname#161640
回答No.1

java.exeは、普通にパラメータを渡せますよ。 java HogeClass 100 200 300 例えばこんな具合にしてHogeClassを起動した場合、main(String[] args)の引数argsには、{"100","200","300"}といった配列が収められます。これを取り出して処理すればいいだけです。

jpenpal
質問者

お礼

回答ありがとうございます。たしかに私の説明が不足している感があり、 新しい投稿の方を早速試してみます。

関連するQ&A

  • javaからffmpegの利用

    ffmpegを呼び出してmp3変換を行いたいのですがずっと動いたまま終了せずに困っています。 import java.io.IOException; public class Cratemp3 { public static void main(String[] args) throws IOException, InterruptedException { ProcessBuilder processBuilder = new ProcessBuilder( "./ffmpeg", "-y" , "-i" , "sample.flv", "-acodec" , "copy" , "sample.mp3" ); Process process = processBuilder.start(); process.waitFor(); } } process.waitFor()を抜くと上手く動きますが process.waitFor()をいれると上手く動きません。 ffmpegで変換したmp3ファイルを使用して処理を続けたいのですがどうしたらいいのでしょうか? よろしくお願いします。

  • ProcessBuilderの使い方

    ProcessBuilderを使用してMysqlのコマンド(Select文、Create文)を実行することはできないか と思い下記サンプルを作ってみました。まづはmysqlを起動するコマンドを実行してみました。 Eclipse上で実行してみたのですが p.waitFor(); の部分で応答が返ってこなくなります。 何か使い方が間違っていますでしょうか。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ProcessBuilderTest { public static void main(String[] args) { ProcessBuilder pb = new ProcessBuilder("mysql", "-u", "root", "-p", "root"); try { Process p = pb.start(); // ping が完了するのを待つ p.waitFor(); // 実行結果を取得するストリームの種別を出力 System.out.println(pb.redirectInput()); try (BufferedReader br = new BufferedReader( new InputStreamReader(p.getInputStream()))) { // ping結果の出力 for(String line = br.readLine(); line != null; line = br.readLine()) { System.out.println(line); } } } catch (IOException | InterruptedException e) { // 例外ハンドリング処理 } } }

  • バッチファイルの起動

    WEBの画面上からボタンをクリックして、バッチファイルを起動させる プログラムを作成しています。 プログラム・バッチ共ローカルで上記のテストを行なった所、正常にバッチを起動することができませんでした。 プログラム・バッチをサーバに移行し上記のテストを行なった所、バッチが起動せきませんでした。 プログラムは以下の通りです。どこが悪くてサーバ上でバッチが起動できないのでしょうか?。 宜しくお願い致します。     (JSP) <hr> <br> <table width="80%"> <tr> <td> <s:submit value=" 入力完了 " cssClass="form_button" action="TEST" method="doEnter" /> </td> </tr> </table> </s:form> </body> <html>     (JAVA) public String doEnter() throws Exception { boolean vCheckResult = true; String result; try { String sCmd = "D:\\bat\\jksys\\atelnet.bat"; ProcessBuilder builder = new ProcessBuilder(sCmd); Process process = builder.start(); int ret = process.waitFor(); System.out.println("process exited with value : " + ret); }catch (IOException e) { // start()で例外が発生 e.printStackTrace(); } catch (InterruptedException e) { // waitFor()で例外が発生 e.printStackTrace(); } return "success"; }

  • JavaAppletのボタンを押すことで、Fortranプログラムが実

    JavaAppletのボタンを押すことで、Fortranプログラムが実行できるようにプログラムを作っています。ですが、今エラーが出て困っています。誰か教えて頂けないでしょうか? 必ず、エラーでディレクトリが見つかりません。とでます。 cdのコマンドでプログラムがある所まで移動したいのですが,どう打てばいいのか分かりません。現在のプログラムは以下のとおりになっています。 OSはLinuxのFedora10です。開発環境としてEclipse使ってます。 try { String command = "./main < input.txt"; //外部プロセス ProcessBuilder pb = new ProcessBuilder(command); //ProcessBuilder構築 Process process = pb.start(); //プロセス実行 process.waitFor(); } catch (Exception e1) { e1.printStackTrace(); }

  • どうしてもプログラムが動いてくれません....

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringWriter; public class Tese { public static void main(String[] args) throws InterruptedException, IOException { ★ ProcessBuilder pb = new ProcessBuilder("cmd", "/C", "dir", "C:\\Program Files\\Java"); ★ Process p = pb.start(); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); Catcher c = new Catcher(br); c.start(); p.waitFor(); p.destroy(); System.out.println(c.out.toString()); } } class Catcher extends Thread { Reader in; StringWriter out = new StringWriter(); public Catcher(Reader in) { this.in = in; } public void run() { int c; try { while ((c = in.read()) != -1) { out.write((char)c); } } catch (IOException e) { e.printStackTrace(); } } ★で囲んでいる部分なのですが,コンパイルすると Exception in thread "main" java.lang.Error: コンパイル問題が未解決です。 コンストラクター ProcessBuilder(String, String, String, String) は未定義です。 at Tese.main(Tese.java:10) というエラーが出ます. どうすればエラーが消えるかわかる方いらっしゃったら,ぜひ助言頂けないでしょうか・へj

    • ベストアンサー
    • Java
  • javaにおけるサブプロセスの待ち方

    以下のコードで問題が起きました。 javaからサブプロセスを読んで、サブプロセスの標準出力から 文字列を取得するプログラムです。 //Inter.java import java.io.*; public class Inter { static final int A = 10; public static void main(String[] arg) { String out = "Initial"; int c; Runtime rt = Runtime.getRuntime(); try{ Process ps = rt.exec("process.exe"); BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream())); System.out.println("Debug:OK"); for(c=0;c < A;c++)//ポイント1 { out = br.readLine(); System.out.println("java:" + out); } out = Integer.toString(ps.waitFor());//ポイント2 System.out.println("終了コード:" + out); }catch(Exception ex){ System.out.println("エラー"); } System.out.println("正常終了"); } } 一方呼び出されるサブプロセスは //process.c //compiled to process.exe #include <stdio.h> int main () { int i,k,n; for(i=0;i<100;i++) { printf("test%d\n",i); } return 235; } ここで、java側のコードの定数Aを1以上に設定るると期待どおりの結果が出るのですがA=0つまり、for文に一度も入らず、標準出力のストリームから文字列を一度も読まないとフリーズします。どうやら out = Integer.toString(ps.waitFor());//ポイント2 の部分で止まるようです。これはなぜでしょうか?これでは、標準出力があるサブプロセスの終了コードだけ知りたい時に不便ではないですか?これはもしやjava言語システムのバグではないでしょうか!waitFor()メソッドの実装が観たいのですがあいにくnativeキーワードがあるメソッドで手元のソースだけではでは中身がわかりません。nativeのさらに中の実装は見ることはできないのでしょうか?

    • ベストアンサー
    • Java
  • EXEへの引数渡しについて

    VC++でプログラミングしています。 MFCを使ってダイアログベースのEXEを造っています。 このEXEは別のプロセスから CreateProcess関数で起動され、 引数も渡されます。 で、質問です。 ダイアログのEXEでは、渡された引数を解析するために、何処で、 どのようにしたらよいのでしょうか? C言語での (argc, argv) のような仕組みがあるのでしょうか? 識者の方、ご教授願います。

  • Java→VB2003アプリ→Batch でbatchファイルが起動できない

    どこで質問すべきか迷ったのですが。。。 質問タイトルどおりなのですが、 JavaアプリからRuntime#exec(); で起動して、Process#waitFor(); で終了待ちをしているアプリ(VB2003アプリ)から、 Shellでbatchファイルを起動しようとすると、起動できないという現象が起こっています。(exeは動きます) JAVAからではなく、単純にVB2003アプリだけを起動するとBatchファイルは正しく起動できます。 このbatchファイルの中から、さらにexeを起動しようとしているのがまずいのでしょうか? プロセスのネストの制限か何かにひっかかっているせいでしょうか? 調べてみたのですが、特に制限らしきものが見当たらなかったのですが、 ご存知でしたら、ご教示ください。

    • ベストアンサー
    • Java
  • javaでwgetを動作させる際に

    wget.exeを動作させると、日本語のファイルを取り出す際に文字が 化けてしまうため、java言語を用いてwget.exeを動作させ、文字 コードを指定することによって文字化けを解消させようと考えて おりますが、その方法がわかりません。 アドバイスの方お願いします。 以下は、現在できているソースです。 import java.io.*; public class wget { public static void main(String[] args) { String[] command = {"cmd.exe", "/c", "C:\\wget\\bin\\wget.exe", "-r", "-l", "1", "-k", "-np", "-nv", "http://dmoz.org/World/Japanese/"}; // 例外の発生を調べるブロック try { Runtime runtime = Runtime.getRuntime(); Process load_process = runtime.exec(command); load_process.waitFor(); } // 例外発生時の処理ブロック catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • Javaプログラムでコマンド実行時のエラー

    Webアプリにて下記プラグラムを実行(Tomcat上で実行)したところ以下のような例外が でました。 cd /home/test/geniatagger-3.0.1 ディレクトリに移動するコマンドで失敗しているようですが Teraterm上で手入力で実行すると実行できます。 何が原因かわかりますでしょうか。 【例外】 java.io.IOException: Cannot run program "cd /home/test/geniatagger-3.0.1": java.io.IOException: error=2, No such file or directory at java.lang.ProcessBuilder.start(ProcessBuilder.java:475) at java.lang.Runtime.exec(Runtime.java:610) at java.lang.Runtime.exec(Runtime.java:483) 【実行したプログラム】 String[] command = {"cd /home/test/geniatagger-3.0.1", "./geniatagger", "I had a pen."}; Process process = Runtime.getRuntime().exec(command); //exec()が非同期実行であるため実行結果が返ってくるまで待つ int no = process.waitFor(); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String str = ""; while (in.ready()) { str = in.readLine(); System.out.println("segmentate=" + str); } in.close();

    • ベストアンサー
    • Java

専門家に質問してみよう