2016-11-23 4 views
1

こんにちは、私は_popenを使用してWindowsコマンドを実行しようとしました。_popenウィンドウを使用するときの問題

同じコードをC++ビルダーのvcl形式で実行します。popen return null pointer?

VC++

std::string exec(const char* cmd) { 
    char buffer[128]; 
    std::string result = ""; 
    FILE* pipe = _popen(cmd, "r"); 
    if (!pipe) throw std::runtime_error("popen() failed!"); 
    try { 
     while (!feof(pipe)) { 
      if (fgets(buffer, 128, pipe) != NULL) 
       result += buffer; 
     } 
    } 
    catch (...) { 
     _pclose(pipe); 
     throw; 
    } 
    _pclose(pipe); 
    return result; 
} 

C++ Builderの

_popen状態の
void __fastcall TForm2::btn_adb_readInfoClick(TObject *Sender) { 
    const char* cmd = "D:\\adb\\adb.exe devices"; 
    char buffer[128]; 
    std::string result = ""; 
    FILE* pipe = _popen(cmd, "r"); // always null 
    char* er = strerror(errno); 
    try 
    { 
     if (!pipe) throw std::runtime_error("popen() failed!"); 
     while (!feof(pipe)) { 
      if (fgets(buffer, 128, pipe) != NULL) 
       result += buffer; 
     } 
    } 
    catch (std::exception &ex) { 
     _pclose(pipe); 
     throw; 
    } 
    _pclose(pipe); 
} 
+0

'_popen()'に失敗した直後の 'errno'の値は何ですか? –

+1

あなたの問題とは無関係ですが、「なぜwhile(!feof(file))」が常に間違っているのですか?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always -wrong) –

+0

@JohnZwinckのerrornoは9(「不正なファイル番号」である) – user1965804

答えて

3

MSDN documentation同上:

Windowsプログラムで使用する場合は、_popen機能が無効 を返します。プログラムを停止させるファイルポインタpは無期限に応答します。 _popenは、コンソールアプリケーションで正常に動作します。

私は、C++ BuilderがコンソールアプリケーションではなくWindowsアプリケーションを作成していると仮定しています。

+0

はい、それは、Windowsアプリケーションでした:) – user1965804

+0

Windowsアプリケーションのための代替とは何ですか? – Jonas

関連する問題