Как вызвать программу Linux из программы Wine - пять баллов по API.
1.Правильно PATHEXT
В новых версиях Wine (начиная с версии 2.0.1) необходимо добавить пустое расширение (т. Е. Просто символ точки: .
) в списокрасширения исполняемого файла в переменной среды PATHEXT
.Без этого добавления сообщение об ошибке может содержать что-то вроде:
Can't recognize '/bin/bash' as an internal or external command, or batch script.
Чтобы исправить начальное значение PATHEXT
в реестре, можно использовать следующий фрагмент команды (для каждого WINEPREFIX
):
k='HKLM\System\CurrentControlSet\Control\Session Manager\Environment'
pathext_orig=$( wine reg query "$k" /v PATHEXT | tr -d '\r' | awk '/^ /{ print $3 }' )
echo "$pathext_orig" | grep -qE '(^|;)\.(;|$)' \
|| wine reg add "$k" /v PATHEXT /f /d "${pathext_orig};."
Этот код проверяет, а затем изменяет PATHEXT
, если он не содержит только элемент .
.
См. Также: Как запустить собственные приложенияиз приложения Windows? в FAQ по WineHQ; NB :
Обратите внимание, что это изменение необходимо будет вносить при каждом обновлении Wine, поскольку оно будет отменяться при каждом обновлении wineprefix.
2.Путь к исполняемому файлу
Вероятно, по умолчанию вам потребуется указать полный (или относительный) путь к исполняемому файлу (например, /bin/bash
), поскольку процесс Wine не наследует * 1037.* переменная окружения из родительского процесса Linux.Обратите внимание, что текущий диск в процессе Wine по умолчанию сопоставлен с корневой папкой Linux, поэтому указывать букву диска не нужно.Т.е. /bin/bash
просто работает, но не bash
.
Другой способ - соответственно изменить переменную окружения PATH
в Wine или изменить текущий каталог.
Всякий раз, когда путь содержитсимволы не ASCII - в качестве аргумента CreateProcessA
- путь должен быть в локали Wine и в соответствии с LANG
переменной среды;см. также ответ Евгения в этой теме и сообщение на форуме о том, как установить кодировку для использования с не-Unicode-приложением в Wine .Для CreateProcessW
путь должен быть в UTF-16 в любом случае.
3.Формат исполняемых файлов
Исполняемые файлы Linux в формате общих объектов не могут быть выполнены из Wine.См .: Исполняемые файлы против общих объектов и Как выполнять сценарии оболочки из 32-битного Wine на 64-битном Linux .Например, /bin/dash
может быть "ELF 64-битным общим объектом LSB" (см. Вывод file /bin/dash
) и не может быть выполнен из Wine в таком случае.Сообщение об ошибке гласит:
wine: Bad EXE format for Z:\bin\dash..
Can't recognize '/bin/dash' as an internal or external command, or batch script.
4.Нет ожидания
Родительский процесс Wine не может ожидать (например, через WaitForSingleObject
) дочернего процесса Linux, поскольку он не снабжен дескриптором дочернего процесса - он равен 0. См. Отчет об ошибке: CreateProcess неправильно устанавливает hProcess при запуске программы для Linux (Статус: CLOSED WONTFIX).
Тем не менее, родительский процесс может косвенно ожидать дочерний процесс, блокируя чтение в определенном канале, если дочерний процессиспользует стандартный вывод (см. также ниже).
5.Разница в перенаправлении каналов
Возможно, это ошибка в Wine, но родительский процесс должен закрыть дескрипторы std, которые передаются в CreateProcess, только после закрытия собственных дескрипторов (или непосредственно перед ним) для соответствующих каналов,В то время как в Windows эти дескрипторы могут быть закрыты сразу после завершения функции CreateProcess
.По MSDN эти дескрипторы могут быть закрыты сразу после прохождения (см. функция CreateProcess ):
Дескрипторы в STARTUPINFO или STARTUPINFOEX должны быть закрыты с помощью CloseHandle, когда они больше не нужны.
В Wine 2.0.1 соответствующий канал в дочернем процессе Linux в этом случае будет немедленно закрыт, а дочерний процесс преждевременно остановится .Но не в случае дочернего процесса Windows.