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

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
DV
Posts: 367
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 12 times
Been thanked: 3 times

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

Post by DV » Wed 22 May, 2019 10:31

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

DV
Posts: 367
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 12 times
Been thanked: 3 times

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

Post by DV » Wed 22 May, 2019 10:32

К примеру, в 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

Shmuel
Posts: 5897
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 218 times

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

Post by Shmuel » Wed 22 May, 2019 11:04

Напишите аналогичную функцию на Lua (из коробки такого нету).

DV
Posts: 367
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 12 times
Been thanked: 3 times

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

Post by DV » Wed 22 May, 2019 11:31

Тогда попробую использовать что-то такое через ffi:
https://stackoverflow.com/questions/701 ... of-windows

2useven10
Posts: 3966
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 168 times

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

Post by 2useven10 » Wed 22 May, 2019 15:14

DV, да, что-то (исправлено)
Last edited by 2useven10 on Wed 22 May, 2019 18:55, edited 3 times in total.

Shmuel
Posts: 5897
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 218 times

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

Post by Shmuel » Wed 22 May, 2019 16:36

if win.IsProcess64bit()
обратите внимание на (), в коде выше оно пропущено.
Last edited by Shmuel on Wed 22 May, 2019 16:37, edited 1 time in total.

2useven10
Posts: 3966
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 168 times

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

Post by 2useven10 » Wed 22 May, 2019 16:51

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

Shmuel
Posts: 5897
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 218 times

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

Post by Shmuel » Wed 22 May, 2019 17:05

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
Last edited by Shmuel on Wed 22 May, 2019 17:08, edited 2 times in total.

2useven10
Posts: 3966
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 168 times

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

Post by 2useven10 » Wed 22 May, 2019 18:33

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

DV
Posts: 367
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 12 times
Been thanked: 3 times

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

Post by DV » Thu 23 May, 2019 15:49

Спасибо, у меня получилось так, с теоретической поддержкой 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 ?

User avatar
DrKnS
Posts: 5402
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 231 times

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

Post by DrKnS » Thu 23 May, 2019 16:45

Code: Select all

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

User avatar
John Doe
Бюрократ
Posts: 12458
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 194 times

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

Post by John Doe » Thu 23 May, 2019 23:53

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

IgorZ
Posts: 609
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 9 times
Been thanked: 43 times

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

Post by IgorZ » Fri 24 May, 2019 05:14

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.

DV
Posts: 367
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 12 times
Been thanked: 3 times

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

Post by DV » Fri 24 May, 2019 09:59

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

Shmuel
Posts: 5897
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 218 times

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

Post by Shmuel » Fri 24 May, 2019 10:32

Самый простой способ - определить эту функцию как глобальную, то есть вместо
local function IsWindows64bit() написать function _G.IsWindows64bit().

User avatar
John Doe
Бюрократ
Posts: 12458
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 194 times

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

Post by John Doe » Fri 24 May, 2019 18:05

@DV
А можно пример выполняемого по условию действия?

Post Reply

Return to “Нужна помощь”