在运行时确定程序是否在Wine下运行

28

我认为标题已经很清楚说明了问题...我正在用C++编写一个应用程序,需要在运行时确定是否在Wine环境下运行(以更改行为,避免特定的Wine错误)。是否有一种对程序员友好的方法,还是应该处理正在运行的进程?


11
如果您在Wine中发现了一个漏洞,请确保您报告它。 - Šimon Tóth
2
@Kerrek 这是一个编译时常量。 - Šimon Tóth
你确定这是Wine的问题,而不是你依赖于Windows的未记录行为? - Matteo Italia
1
不,我不是,但这并不重要。 :) 我知道如何解决问题,我只需要知道是否在 Wine 下运行。我将尝试使用注册表。 - kingofx87
4
更好的答案:http://www.winehq.org/pipermail/wine-devel/2008-September/069387.html。另请参阅http://wiki.winehq.org/DeveloperFaq#head-96551a33b168826cd805c2f62c4ea705ac02f350。 - user1457056
2个回答

16

这个答案只是用户1457056的评论的复制。由于链接经常失效,答案有时会变得无用。我已经复制了链接内容在这里,以保留此有用的答案:

#include <windows.h>
#include <stdio.h>
int main(void)
{
    static const char *(CDECL *pwine_get_version)(void);
    HMODULE hntdll = GetModuleHandle("ntdll.dll");
    if(!hntdll)
    {
        puts("Not running on NT.");
        return 1;
    }

    pwine_get_version = (void *)GetProcAddress(hntdll, "wine_get_version");
    if(pwine_get_version)
    {
        printf("Running on Wine... %s\n",pwine_get_version());
    }
    else
    {
        puts("did not detect Wine.");
    }

    return 0;
}

11

有许多特定于Wine的注册表项:

HKEY_CURRENT_USER\Software\Wine
HKEY_LOCAL_MACHINE\Software\Wine

Checking if a registry key exists网页中有如何检查这些与Wine相关的注册表键的答案。


3
这是一个糟糕的解决方案,因为任何人都可以在Windows上创建这些注册表键。 - Mario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接