ここから本文です

CからC.exeの戻り値を取得する方法 C言語で作成した実行ファイルを 別のC言語...

nic********さん

2014/8/2812:57:19

CからC.exeの戻り値を取得する方法

C言語で作成した実行ファイルを
別のC言語の実行ファイルから呼び出し、
その戻り値を呼び出し元で使用したいのです。

当初の予定ですと、
1.呼び出し元でデータを入力
2.systemで入力データを呼び出し先へ渡して実行
3.呼び出し先の演算結果(return)を返して呼び出し元で使用

だったのですが、これではダメでした。
さまざまなサイトで調べてみたのですが、
どうやらsystemは概ね成功かエラーしか返さず、
戻り値は扱っていないみたいですね。
そのくせやり方は記述されてなかったです。
(気づいてなかっただけかもしれない)

記述があっても別の言語からだったり、
WEXITSTATUSがWindowsにはなかったり、
forkやexecがわけわからなかったりで、
結局できません。

需要がない方法のために
手段がないのかもしれませんが、
もし方法があるなら教えていただけると幸いです。

閲覧数:
2,717
回答数:
5
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

are********さん

2014/8/2817:04:03

Windows環境であればこのような場合はCreateProcess APIを使います。

http://www.ne.jp/asahi/hishidama/home/tech/c/windows/CreateProcess....
の解説がそのものズバリとおもわれますがどうでしょう?

上記サイトの引用(要約)となりますが
(1)CreateProcessで別アプリを起動
(2)WaitForSingleObject()で終了を待つ
(3)GetExitCodeProcess()で終了コードを取得する
(4)CloseHandle()でハンドルをクローズする
で呼出し先アプリの終了コードを取得することができます。

  • 質問者

    nic********さん

    2014/8/2900:46:59

    手を加える必要があるところ以外は
    まるで意味がわかりませんが、一応できました。
    知らない関数や型しかないせいで困ったので、
    せめて回答にでてきた関数くらいは使えるようにしたいです。
    回答ありがとうございました。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2014/8/29 00:53:19

降参 皆様すばやい回答ありがとうございました。
もう少しプログラムのアプローチについても勉強するべきでした。
もっとプログラミングの幅が広がるようにがんばります!

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

acc********さん

2014/8/2817:29:36

私の環境(win7 32bitにBorland C++ Compiler)だけかもしれませんが、以下のコードでこんな結果になりましたがこういったことではないですか?

//a.c
#include <stdio.h>
#include <stdlib.h>
int main (void) {
printf("%d", system("b.exe 10 2"));
return 0;
}

//b.c
#include <stdlib.h>
int main (int argc, char *argv[]) {
if (argc!=3) return -1;
return strtol(argv[1], NULL, 10)+strtol(argv[2], NULL, 10);
}

出力結果:
12

日本語版は読みづらかったので英語版のMSDNより
"If command is not NULL, system returns the value that is returned by the command interpreter."
とあります。つまりsystemの戻り値はそのままコマンドインタプリタ(プログラム)の戻り値になるはずです。環境変数でいうところのERRORLEVELに相当します。
あとはb.exeの呼び出しの横に付いている引数も含めて、system()に渡すコマンドをsprintfかなんかで作ってやればいいと思いますがどうでしょうか。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

bas********さん

2014/8/2814:39:40

これはどうでしょうか。

最初に開く実行ファイル: A.exe
コールしたい実行ファイル: B.exe


とします。


で、

A.exe で system関数かなんかで、

system( "B 10 2" );

のように B.exe 自身に引数を渡します。

で、

B.exe が実行されると 先ほど渡された引数で何らかの処理。

で、その結果を

char *Data; // 配列かポインタ
// データ処理 + Dataに文字列を代入
// Data には "A 100 30" のような
// ファイル名 + 引数 が入っている

system( Data );

でBを閉じる。

でどうでしょうか。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

k03********さん

2014/8/2814:01:25

nichijou255さん

簡潔に2個のプログラムを書く。
データと言ってもいろいろある。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

dou********さん

2014/8/2813:35:06

リダイレクトじゃダメなんでしょうか?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる