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

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

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

Post by DV »

Как из lua-макроса определить битность системы (32-bit, 64-bit)?
То есть не битность самого FAR, не битность интерпретатора Lua, а битность самой Windows.
Кажется, такой простой вопрос, а ответ что-то не нахожу...
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

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

Post 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
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

Напишите аналогичную функцию на Lua (из коробки такого нету).
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

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

Post by DV »

Тогда попробую использовать что-то такое через ffi:
https://stackoverflow.com/questions/701 ... of-windows
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

DV, да, что-то (исправлено)
Last edited by 2useven10 on Wed 22 May, 2019 18:55, edited 3 times in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

if win.IsProcess64bit()
обратите внимание на (), в коде выше оно пропущено.
Last edited by Shmuel on Wed 22 May, 2019 16:37, edited 1 time in total.
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

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: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post 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
Last edited by Shmuel on Wed 22 May, 2019 17:08, edited 2 times in total.
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

Shmuel, Не знаю в чём было дело, хоть мой код хоть исправленный не работал с невразумительной диагностикой.
После перезагрузки всё нормализовалось - на моём ошибка int -> int*, исправленный работает.
Last edited by 2useven10 on Wed 22 May, 2019 18:57, edited 2 times in total.
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

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

Post 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 ?
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

Code: Select all

cmd /c "if defined ProgramFiles(x86) (echo 64-bit OS) else echo 32-bit OS"
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

DV wrote: Thu 23 May, 2019 15:49 Как функцию IsWindows64bit() сделать доступной для вызова из FarMenu.Ini ?
Зависит от того, каким образом вы собираетесь это использовать
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

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

Post by IgorZ »

DV wrote: Wed 22 May, 2019 10:31 Как из lua-макроса определить битность системы (32-bit, 64-bit)?
То есть не битность самого FAR, не битность интерпретатора Lua, а битность самой Windows.
Кажется, такой простой вопрос, а ответ что-то не нахожу...
В своё время я делал это так:
  1. --[[
  2.  
  3. ┌─────────────────────────────────────┬──────────────────────┬───────────────────────────────────────┐
  4.  
  5. │Разрядность ОС                       │PROCESSOR_ARCHITECTURE│PROCESSOR_ARCHITEW6432                 │
  6.  
  7. ├─────────────────────────────────────┼──────────────────────┼───────────────────────────────────────┤
  8.  
  9. │Win32                                │x86                   │не определена, возвращает пустую строку│
  10.  
  11. │Win64 на AMD64                       │AMD64                 │не определена, возвращает пустую строку│
  12.  
  13. │Win64 на Itanium                     │IA64                  │не определена, возвращает пустую строку│
  14.  
  15. │Win64, программа для Win32           │x86                   │AMD64                                  │
  16.  
  17. │Win64 на Itanium, программа для Win32│x86                   │IA64                                   │
  18.  
  19. └─────────────────────────────────────┴──────────────────────┴───────────────────────────────────────┘
  20.  
  21. --]]
  22.  
  23. local arch,a6432,res = win.GetEnv("PROCESSOR_ARCHITECTURE"),win.GetEnv("PROCESSOR_ARCHITEW6432")
  24.  
  25.  
  26.  
  27. if arch=="AMD64" then
  28.  
  29.   res = "64bit Windows on x64"
  30.  
  31. elseif arch=="IA64" then
  32.  
  33.   res = "64bit Windows on Itanium"
  34.  
  35. elseif arch=="x86" then
  36.  
  37.   res = "32bit Windows on "
  38.  
  39.   if a6432==nil then
  40.  
  41.     res = res.."32bit processor"
  42.  
  43.   elseif a6432=="AMD64" then
  44.  
  45.     res = res.."x64 processor"
  46.  
  47.   elseif a6432=="IA64" then
  48.  
  49.     res = res.."Itanium"
  50.  
  51.   end
  52.  
  53. end
  54.  
  55. far.Show(res)
По-моему, проще, чем через ffi.
DV
Posts: 455
Joined: Mon 07 Aug, 2006 08:23
Has thanked: 31 times
Been thanked: 15 times

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

Post 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
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

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

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