【问题标题】:Getting Free RAM in Windows Programmatically?以编程方式在 Windows 中获取可用 RAM?
【发布时间】:2011-02-17 16:39:30
【问题描述】:

所有, 在这里需要一些帮助。我来自纯 Java 背景,对 C 编程知之甚少。基本上我需要编写一个 C 程序(并创建一个可执行文件),它将在 Windows 机器(XP/2008/7)上输出空闲字节(RAM)的数量

我对此进行了一些研究,发现有一个名为 GlobalMemoryStatusEx 的函数,还有一个链接: http://msdn.microsoft.com/en-us/library/aa366589(v=vs.85).aspx

我已经用 gcc 安装了 cygwin,而上面的程序甚至不能为我编译。我知道我在这里做了一些愚蠢的事情..

$ gcc hello.c -o hello.exe
hello.c:3:19: error: tchar.h: No such file or directory
hello.c: In function `main':
hello.c:7: error: `MEMORYSTATUSEX' undeclared (first use in this function)
hello.c:7: error: (Each undeclared identifier is reported only once
hello.c:7: error: for each function it appears in.)
hello.c:7: error: expected `;' before `statex'
hello.c:9: error: `statex' undeclared (first use in this function)

非常感谢任何帮助!

【问题讨论】:

  • 即使你能掌握这个统计数据,也应该警告你它在很大程度上是无用的。
  • 更新:我安装了 MiniGW,它摆脱了 tchar.h 问题,但其余错误仍然存​​在。使用与此链接中提到的完全相同的程序:msdn.microsoft.com/en-us/library/aa366589(v=vs.85).aspx
  • @David:这不是没用,只是不代表大多数人认为的那样。
  • @sunny 停止使用 GCC 并使用 Visual Studio。这几天其实挺好的。它甚至有一个非常好的调试器。如果您是在 Windows 上开始使用 C 或 C++,那么您将通过这种方式更快地启动和运行。
  • @Sunny:你#include <windows.h>了吗?如果你这样做了,那么 GCC 根本不支持那个 Windows API 函数,所以你要么需要自己声明它,要么将编译器切换到真正支持 Windows API 的编译器。

标签: c windows memory-management


【解决方案1】:

正如 larsmans 所说,cygwin 不是 Windows 原生编译器。除了MinGW,你还可以考虑Visual C++ 2010 Express

【讨论】:

  • 请注意,如果您是学生并且在大学,您可以从 MSDNAA 获得 Visual Studio 的完整副本,如果您是学生但无法使用,您可以使用 @987654322 @.
【解决方案2】:

Cygwin 默认在 Windows 上模拟 Unix API,而不是提供 Windows API。

MinGW 包可能会更成功,它是 GCC for Windows + Windows API。

【讨论】:

  • 谢谢,我已经下载了 MiniGW。它摆脱了 tchar.h 标头问题,但其他错误仍然存​​在 :-(
【解决方案3】:

如果您不熟悉 C,并且只想为 Windows 编写这个小程序,您可能会发现使用免费的Visual C++ Express 会更容易上手。 MSDN 示例很有可能开箱即用。

编辑:您提到了 Java,但尚不完全清楚此 C 应用程序的唯一目的是否是从 Java 调用。如果是这样,我想我会提到一个叫做JNative 的东西。它似乎是一个纯 Java 库,其中包含 a wrapper for GlobalMemoryStatusEx 等内容。请注意,我通过 Google 搜索找到了 JNative,但我自己没有使用过。

【讨论】:

    【解决方案4】:

    您引用的函数是 Windows API 函数,这意味着您不能从 cygwin 调用该函数,cygwin 是 Windows 之上的 POSIX 仿真层。

    此时您有几个选择:

    1. 您可以免费下载并安装 Windows SDK,其中包括 Visual Studio C/C++ 编译器。
    2. 您可以免费下载Visual C++ Express Edition 的副本。
    3. 如果您是学生,您可以从 MSDNAA(由您的大学提供)或 DreamSpark 获得 Visual Studio 2010 的完整副本。
    4. 您可以购买完整的 Visual Studio 副本。
    5. 您可以下载并安装MinGW,这是移植到 Windows 的 GCC 编译器。

    请注意,所有 Microsoft 编译器都支持整个 Win32 API。 MinGW 在 Windows 上对 Unicode 的处理受到限制,它不支持 COM(所以如果你想调用 COM API 会很痛苦),并且它不包括 Windows SDK 中包含的所有标头。

    GCC 是一个很棒的编译器,只是它对 Windows 的支持并不是那么好。

    【讨论】:

    • 谢谢比利,我选择了选项 #5,但仍然卡住了。
    【解决方案5】:

    给出的答案是正确的,但我觉得他们没有正确解释问题。

    Unix 和类 Unix 操作系统努力遵守称为 POSIX 的标准 API。 Windpws 不符合 POSIX。 Cygwin 是为了在 Windows 上提供 POSIX 合规性而编写的。因此,当您在 Cygwin 上编译时,您正在编译 POSIX API,而不是 Windows API。您在 MSDN 上找到的功能在 POSIX 中不存在。三是,你会得到编译错误。

    MinGW 被 gcc 移植到 Windows。它知道具有适当包含的 Windows API。 Visual Studio 的 nmake 在这方面是一样的(提供对 Win API 的访问)。

    【讨论】:

    • 调用 nmake 端口有点牵强;它不支持诸如 GNU 扩展之类的东西。
    • 我的意思是 nmake 提供了 Windows API 可访问性。
    【解决方案6】:

    要使用 cygwin gcc 通过 Win32 API 编译程序,您需要 mingw-i686-headers 包(其中包括像 tchar.h 这样的头文件)。

    那么,你可能还需要define some macros to enable newer APIs

    【讨论】:

    • 谢谢,我刚下载了MiniGW,又更进一步了。不知道为什么我的程序仍然没有编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2019-11-05
    相关资源
    最近更新 更多