【问题标题】:Running command prompt commands in own application在自己的应用程序中运行命令提示符命令
【发布时间】:2015-10-16 06:06:22
【问题描述】:

有没有办法从 C 应用程序中运行命令提示符命令?我想使用wmic diskdrive get serialnumber 命令查看硬盘的制造商序列号。

【问题讨论】:

标签: c windows command-prompt


【解决方案1】:

有很多函数可以让你从C调用外部程序,其中一些是"standard",一些是specific to Windows

但在您的场景中,我建议您使用 Windows 提供的 WMI API,您可以在 stackoverflow 上找到这方面的示例:

How to obtain data from WMI using a C Application? how to run a wmi query in c

我没有提供示例,而是链接到关于 SO 的现有答案,因为我认为复制已经存在的内容没有意义。

【讨论】:

  • 从 MSDN 参考到 WMI COM Api,它说:“注意 WMI 仅支持使用 Microsoft Visual C++ 6.0 版和更高版本的开发系统进行 C++ 开发。”
  • 请查看上面提供的链接。它显示了一个纯 C 的示例,不涉及 C++。看来 COM 只是访问 WMI 的一种选择。
【解决方案2】:

您可以尝试使用popen :-

#include<stdio.h>
#include<string.h>

int main()
{
   char c;
   FILE *file = popen("wmic diskdrive get serialnumber", "r");
   if (file) {
     while ((c = getc(file)) != EOF)
        putchar(c);
    fclose(file);
   }
   return 0;
}

由于这是一个文件对象,您现在可以根据需要轻松将其写入文件,也可以随意检索它。

【讨论】:

    【解决方案3】:

    是的,你可以。但是,这样做被认为是不好的做法,因为这会使您的应用不必要地依赖平台并产生开销。

    像这样

    #include <stdio.h>
    #include <string.h>
    void main ()
    {
        system("wmic diskdrive get serialnumber");
    }
    

    阅读更多内容here 关于输出(引用自上面的链接):

    错误返回值为-1,返回状态为 否则命令。

    您还可以使用ReadConsoleOutputCharacter 函数(链接到 msdn 入站引用)来读取控制台输出。

    但是,在您尝试使用命令提示符获取此类数据之前,请考虑使用 API 或任何其他方式来检索数据,因为调用命令提示符会为您的应用程序增加不必要的可笑开销。

    【讨论】:

    • 那么输出如何检索?
    • 来自我链接的链接,关于输出:“返回的值为 -1 错误,否则命令的返回状态。”
    • 不。 wmic 的输出类似于 SerialNumber Z81EFB1 E6503403 F123123。这不适合int
    • 如果您正在为特定平台编写代码,那么使用该平台的功能是不错的做法。无论如何,检查制造商和序列号可能会依赖于平台,所以你几乎抛弃了完整的可移植性。但如果有办法通过 WinAPI(可能有)做到这一点,那肯定更好。
    • 进一步挖掘说有一个 WIM api,但它只在 c++ 中真正有效
    猜你喜欢
    • 2020-08-13
    • 2015-12-08
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2019-05-28
    • 2010-11-30
    相关资源
    最近更新 更多