Page 1 of 2

Как из lua-макроса определить битность системы?

Posted: Wed 22 May, 2019 10:31
by DV
Как из lua-макроса определить битность системы (32-bit, 64-bit)?
То есть не битность самого FAR, не битность интерпретатора Lua, а битность самой Windows.
Кажется, такой простой вопрос, а ответ что-то не нахожу...

Как из lua-макроса определить битность системы?

Posted: Wed 22 May, 2019 10:32
by DV
К примеру, в bat-файлах делается примерно такая пляска с бубном:

Code: Select all

REM OS bitness: 32/64
set OS_BITNESS=64
if "%PROCESSOR_ARCHITECTURE%"=="" set OS_BITNESS=32
if %PROCESSOR_ARCHITECTURE%==x86 (
  if not defined PROCESSOR_ARCHITEW6432 set OS_BITNESS=32
)
echo Detected OS bitness: %OS_BITNESS%-bit

Как из lua-макроса определить битность системы?

Posted: Wed 22 May, 2019 11:04
by Shmuel
Напишите аналогичную функцию на Lua (из коробки такого нету).

Как из lua-макроса определить битность системы?

Posted: Wed 22 May, 2019 11:31
by DV
Тогда попробую использовать что-то такое через ffi:
https://stackoverflow.com/questions/701 ... of-windows

Как из lua-макроса определить битность системы?

Posted: Wed 22 May, 2019 15:14
by 2useven10
DV, да, что-то (исправлено)

Как из lua-макроса определить битность системы?

Posted: Wed 22 May, 2019 16:36
by Shmuel
if win.IsProcess64bit()
обратите внимание на (), в коде выше оно пропущено.

Как из lua-макроса определить битность системы?

Posted: Wed 22 May, 2019 16:51
by 2useven10
Shmuel wrote:
Wed 22 May, 2019 16:36
обратите внимание на (), в коде выше оно пропущено.
Не проущено. Со скобками не работает. Почему - не знаю...

Как из lua-макроса определить битность системы?

Posted: Wed 22 May, 2019 17:05
by Shmuel
2useven10, тем не менее, это ошибка. Вот исправленный код:

Code: Select all

local ffi = require("ffi")

ffi.cdef([[
BOOL IsWow64Process(HANDLE hProcess, BOOL *Wow64Process);
HANDLE GetCurrentProcess(void);
]])

local function is64bitHost()
  if win.IsProcess64bit() then return true end
  local wow64 = ffi.new("BOOL[1]")
  if ffi.C.IsWow64Process(ffi.C.GetCurrentProcess(), wow64) == 0 then return false end
  return wow64[0] ~= 0
end

Как из lua-макроса определить битность системы?

Posted: Wed 22 May, 2019 18:33
by 2useven10
Shmuel, Не знаю в чём было дело, хоть мой код хоть исправленный не работал с невразумительной диагностикой.
После перезагрузки всё нормализовалось - на моём ошибка int -> int*, исправленный работает.

Как из lua-макроса определить битность системы?

Posted: Thu 23 May, 2019 15:49
by DV
Спасибо, у меня получилось так, с теоретической поддержкой Windows XP:

Code: Select all

local ffi = require("ffi")
ffi.cdef[[
  HMODULE GetModuleHandleA(const char* lpModuleName);
  void* GetProcAddress(HMODULE hModule, const char* lpProcName);
  HANDLE GetCurrentProcess(void);
  typedef BOOL (__stdcall *PFnIsWow64Proc)(HANDLE, BOOL*);
]]

local function IsWindows64bit()
  if win.IsProcess64bit() then
    return true
  else
    local hModule = ffi.C.GetModuleHandleA("kernel32")
    local pAddr = ffi.C.GetProcAddress(hModule, "IsWow64Process")
    if pAddr ~= nil then
      local pFunc = ffi.cast("PFnIsWow64Proc", pAddr)
      local boolArr = ffi.typeof"BOOL[1]"
      local isWow64 = boolArr()
      local hProcess = ffi.C.GetCurrentProcess()
      if pFunc(hProcess, isWow64) ~= 0 then
        if isWow64[0] ~= 0 then
          return true
        end
      end
    end
    return false
  end
end
А теперь - следующий вопрос :) Как функцию IsWindows64bit() сделать доступной для вызова из FarMenu.Ini ?

Как из lua-макроса определить битность системы?

Posted: Thu 23 May, 2019 16:45
by DrKnS

Code: Select all

cmd /c "if defined ProgramFiles(x86) (echo 64-bit OS) else echo 32-bit OS"

Как из lua-макроса определить битность системы?

Posted: Thu 23 May, 2019 23:53
by John Doe
DV wrote:
Thu 23 May, 2019 15:49
Как функцию IsWindows64bit() сделать доступной для вызова из FarMenu.Ini ?
Зависит от того, каким образом вы собираетесь это использовать

Как из lua-макроса определить битность системы?

Posted: Fri 24 May, 2019 05:14
by IgorZ
DV wrote:
Wed 22 May, 2019 10:31
Как из lua-макроса определить битность системы (32-bit, 64-bit)?
То есть не битность самого FAR, не битность интерпретатора Lua, а битность самой Windows.
Кажется, такой простой вопрос, а ответ что-то не нахожу...
В своё время я делал это так:
  1. --[[
  2. ┌─────────────────────────────────────┬──────────────────────┬───────────────────────────────────────┐
  3. │Разрядность ОС                       │PROCESSOR_ARCHITECTURE│PROCESSOR_ARCHITEW6432                 │
  4. ├─────────────────────────────────────┼──────────────────────┼───────────────────────────────────────┤
  5. │Win32                                │x86                   │не определена, возвращает пустую строку│
  6. │Win64 на AMD64                       │AMD64                 │не определена, возвращает пустую строку│
  7. │Win64 на Itanium                     │IA64                  │не определена, возвращает пустую строку│
  8. │Win64, программа для Win32           │x86                   │AMD64                                  │
  9. │Win64 на Itanium, программа для Win32│x86                   │IA64                                   │
  10. └─────────────────────────────────────┴──────────────────────┴───────────────────────────────────────┘
  11. --]]
  12. local arch,a6432,res = win.GetEnv("PROCESSOR_ARCHITECTURE"),win.GetEnv("PROCESSOR_ARCHITEW6432")
  13.  
  14. if arch=="AMD64" then
  15.   res = "64bit Windows on x64"
  16. elseif arch=="IA64" then
  17.   res = "64bit Windows on Itanium"
  18. elseif arch=="x86" then
  19.   res = "32bit Windows on "
  20.   if a6432==nil then
  21.     res = res.."32bit processor"
  22.   elseif a6432=="AMD64" then
  23.     res = res.."x64 processor"
  24.   elseif a6432=="IA64" then
  25.     res = res.."Itanium"
  26.   end
  27. end
  28. far.Show(res)
По-моему, проще, чем через ffi.

Как из lua-макроса определить битность системы?

Posted: Fri 24 May, 2019 09:59
by DV
John Doe wrote:
Thu 23 May, 2019 23:53
DV wrote:
Thu 23 May, 2019 15:49
Как функцию IsWindows64bit() сделать доступной для вызова из FarMenu.Ini ?
Зависит от того, каким образом вы собираетесь это использовать
Я предполагаю, что функция IsWindows64bit() живёт в одном из файлов .lua в папке скриптов, и для того, чтобы эта функция была видна извне, её нужно определить специальным образом (?).
Вызывать её в FarMenu.Ini предполагаю с помощью

Code: Select all

lua:if IsWindows64bit() then ... end

Как из lua-макроса определить битность системы?

Posted: Fri 24 May, 2019 10:32
by Shmuel
Самый простой способ - определить эту функцию как глобальную, то есть вместо
local function IsWindows64bit() написать function _G.IsWindows64bit().

Как из lua-макроса определить битность системы?

Posted: Fri 24 May, 2019 18:05
by John Doe
@DV
А можно пример выполняемого по условию действия?