2

私がやろうとしているのは、実行中に「--exampleparameter --exampleparameter2」をCLI入力としてexamplecliprogram.exeを開き、examplecliprogram.exeが終了するのを待ってから、出力を取得して何か便利なことを行うプログラムを作成することです。それと。examplecliprogram.exeからの出力がオーバーヘッドプログラムを実行しているウィンドウに表示されている間に、examplecliprogram.exeを(別のウィンドウで開くのではなく)バックグラウンドで実行したいと思います。

これまで、popen()、ShellExecute()、CreateProcess()などのオプションについて説明してきましたが、いずれも正しく機能していないようです。

主に、このプログラムをWindows環境で独立して実行できるようにしたいので、Linuxとの互換性はボーナスになります。

編集:system( "arguments")を呼び出すことで1つの解決策を見つけました。これがGUIにうまく移行する良い解決策であるかどうかはわかりませんが、少なくとも根本的な問題は解決します。

4

4 に答える 4

0

このMicrosoftのサンプルコードをご覧ください。それは私にとって役に立ちました。 http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx

于 2012-08-03T06:53:20.057 に答える
0

私はCreateProcessを使用しましたが、残念ながら、「msdnを注意深く読む」と「単純なものから始めて複雑なものへと進む」以外のことはお勧めできません。

移植性に関しては、これまでクロスプラットフォームツールキットを使用する必要がなかった場合は、これだけの理由でクロスプラットフォームツールキットの使用を開始することはお勧めしません。「開始プロセス」ラッパーを作成し、ネイティブの方法で各プラットフォームに実装することをお勧めします。

于 2012-08-03T07:00:42.853 に答える
0

このコードはWindowsとUnixで実行されます(Visual Studio、CygwinのGCC、Mac OS XのGCCでテストしました)。

プラットフォームに応じてpopenを定義するためにマクロを使用する必要がありました。これは、Windowsでは関数が_popenであるのに対し、他のプラットフォームでは関数名がであるためですpopen(前者のアンダースコアに注意してください)。

#include <stdlib.h>
#include <stdio.h>

/* Change to whichever program you want */
//#define PROGRAM "program.exe --param1 --param2"
#define PROGRAM "dir"
#define CHUNK_LEN 1024

#ifdef _WIN32
#define popen _popen
#define pclose _pclose
#endif

int main(int argc, char **argv) {

    /* Ensure that output of command does interfere with stdout */
    fflush(stdin);
    FILE *cmd_file = (FILE *) popen(PROGRAM, "r");
    if (!cmd_file) {
        printf("Error calling popen\n");
    }

    char *buf = (char *) malloc(CHUNK_LEN);
    long cmd_output_len = 0;
    int bytes_read = 0;
    do {
        bytes_read = fread(buf + cmd_output_len, sizeof(char), CHUNK_LEN, cmd_file);
        cmd_output_len += bytes_read;
        buf = (char *) realloc(buf, cmd_output_len + CHUNK_LEN);
    } while (bytes_read == CHUNK_LEN);

    /* Nul terminate string */
    *((char *) buf + cmd_output_len) = '\0';

    /* Close file pointer */
    pclose(cmd_file);

    /* Do stuff with buffer */
    printf("%s\n", buf);

    /* Free buffer */
    free(buf);

    return 0;
}
于 2012-08-03T15:20:57.057 に答える
0

これを行う最もクリーンでポータブルな方法は、GLibを使用することg_spawn_sync()です。

ドキュメントはオンラインで見つけることができます。

gchar * std_out = NULL;
gchar * std_err = NULL;
gint exit_stat = 0;
const char *argv[] = {"--foo", "123", "--bar", "22323", NULL};

if(!g_spawn_sync (NULL, argv, NULL, NULL, NULL, NULL, &std_out, &std_err, &exit_stat, NULL)){
   fprintf(stderr, "Failed to spawn!\n");
};

/* std_out and std_err should now point to the respective output.*/
于 2012-08-06T16:09:52.540 に答える