【问题标题】:How to detect is Wine running from Linux or from mac OS environment in C++?如何检测 Wine 是从 Linux 运行还是从 C++ 中的 mac OS 环境运行?
【发布时间】:2019-10-10 04:24:44
【问题描述】:

我有一个使用 Wine for mac OS 和 Wine for Linux 运行的 C++ 应用程序。我正在寻找一种使用 C++ 检测主机操作系统的方法。

我发现的唯一方法是检测它是否是 Wine(使用 wine_get_version),但我仍然需要将 mac OS 和 Linux 运行分开。

有什么办法吗?

谢谢!

【问题讨论】:

  • 看起来在其中一个 ntdll 中有一个 wine_get_host_version 函数,但我没有找到关于它的文档。
  • 我相信,即使在 Wine 下运行,您仍然可以调用本机 OS 函数。你能从那里拿走吗?
  • 考虑在您的 C++ 应用程序中使用 QtPOCO

标签: c++ linux macos wine


【解决方案1】:

正如 @NathanOliver 在 cmets 中提到的,您应该为此使用 wine_get_host_version()。与wine_get_version() 一样,您需要使用GetProcAddress() 从NTDLL 中获取函数指针。函数指针的 C 函数签名将是:

void (CDECL *)( const char **sysname, const char **release )

您提供两个const char* 变量的地址,wine_get_host_version() 将它们设置为指向两个字符串。字符串是由uname() 系统库函数输出的字符串。 (如果您对输出不感兴趣,可以安全地为该参数传递 NULL。)

对于 macOS,*sysname 将设置为指向 "Darwin"。对于 Linux,它会指向 "Linux",我相信。 (在我测试的几个系统上确实如此,但我不知道它的一致性如何。)

【讨论】:

    【解决方案2】:

    我们需要检查编译器定义的宏(GNU GCC 或 G++) 用于检查我们的 c/c++ 脚本正在执行的操作系统。

    #include <stdio.h>
    
    int main() 
    {
        #if __APPLE__
            // apple specific code
        #elif _WIN32
            // windows specific code
        #elif __LINUX__
            // linux specific code
        #else
            // general code or warning
        #endif
        // general code
        return 0;
    }
    

    some more macros

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2021-03-12
      • 1970-01-01
      • 2018-10-22
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多