您好我尝试使用_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);
}
答案 0 :(得分:3)
_popen
州的MSDN documentation:
如果在Windows程序中使用,
_popen
函数将返回无效 导致程序无限期停止响应的文件指针。_popen
在控制台应用程序中正常运行。
我假设C ++ Builder正在创建Windows应用程序而不是控制台应用程序。