使用_popen窗口时出现问题

时间:2016-11-23 07:56:02

标签: c++

您好我尝试使用_popen运行execute windows命令,并且在控制台的vc ++中可以正常工作。

虽然我在c ++ builder vcl中执行相同的代码,但popen返回空指针?

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与上面相同

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);
}

1 个答案:

答案 0 :(得分:3)

_popen州的MSDN documentation

  

如果在Windows程序中使用,_popen函数将返回无效   导致程序无限期停止响应的文件指针。   _popen在控制台应用程序中正常运行。

我假设C ++ Builder正在创建Windows应用程序而不是控制台应用程序。