Вопрос Как определить, что установщик запущен через Wine?

zettend

Старожил
Здравствуйте!
Хочу обеспечить свой установщик "Wine Compatibility". Ибо часто в случае с Wine необходимо устанавливать дополнительные библиотеки и зависимости.
Необходимо понимать, что установщик запущен через Wine и соответственно проводит необходимые операции.

Ну собственно суть вопроса, как программу заставить распознавать запуск внутри Wine?
 

Shegorat

Lord of Madness
Администратор
Без понятия. Wine это виртуалка с виндой или что? Как оно работает?
 

zettend

Старожил
Утилита при помощи которой запускают Windows приложения на Linux/Mac.

Wiki написал(а):
Название W.I.N.E. — рекурсивный акроним и расшифровывается «Wine Is Not Emulator» — «W.I.N.E. — это не эмулятор». Имеется в виду, что Wine — это не эмулятор компьютера или виртуальная машина, как, например, qemu, VirtualBox и другие подобные им. Вместо этого Wine — это альтернативная, свободная реализация Windows API.
 

Shegorat

Lord of Madness
Администратор
Я знаю что это в принципе такое. Но не как оно работает. Без этого знания определить Wine это или нет - не получится.
Возможно смотреть какие-то переменные среды, которые доступны только в Wine или наоборот недоступны там. Может есть что-то в доке к нему
 

zettend

Старожил
На 'Cpp'(может ошибаюсь) используют такой способ:

C++:
#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;
}
 

Leserg

Участник
zettend, статья на Хабре.

Ну а для Inno Setup (Unicode) примерно так:
Код:
[Code]
function GetProcAddress(hModule: THandle; lpProcName: String): LongInt; external 'GetProcAddress@kernel32.dll stdcall';
function GetModuleHandle(lpModuleName: String): THandle; external 'GetModuleHandleW@kernel32.dll stdcall';

function GetWineAvail: Boolean;
var
  H: THandle;
  W: LongInt;
begin
  Result := False;
  H := GetModuleHandle('ntdll.dll');
  if H > 0 then begin
    W := GetProcAddress(H, 'wine_get_version');
    if W <> 0 then
      Result := True;
  end;
end;

function InitializeSetup(): Boolean;
begin
  if GetWineAvail() then
    MsgBox('Ура! Мы под Винищем!', mbInformation, MB_OK)
  else
    MsgBox('Чистейший Виндовз, сэр!', mbInformation, MB_OK)
end;
 

Leserg

Участник
Еще предлагают просто проверять наличие в реестре ключа “SOFTWARE\Wine\Wine\Config” (в разделах HKCU и HKLM). В общем случае только “SOFTWARE\Wine”. Если ключ существует, то запуск выполняется из под Wine.

Попробуйте оба способа и выберите наиболее приемлемый для ваших условий.
 
Сверху