Как из lua-макроса определить битность системы?
Как из lua-макроса определить битность системы?
Как из lua-макроса определить битность системы (32-bit, 64-bit)?
То есть не битность самого FAR, не битность интерпретатора Lua, а битность самой Windows.
Кажется, такой простой вопрос, а ответ что-то не нахожу...
То есть не битность самого FAR, не битность интерпретатора Lua, а битность самой Windows.
Кажется, такой простой вопрос, а ответ что-то не нахожу...
Как из lua-макроса определить битность системы?
К примеру, в 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-макроса определить битность системы?
Тогда попробую использовать что-то такое через ffi:
https://stackoverflow.com/questions/701 ... of-windows
https://stackoverflow.com/questions/701 ... of-windows
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Как из lua-макроса определить битность системы?
if win.IsProcess64bit()
обратите внимание на (), в коде выше оно пропущено.
обратите внимание на (), в коде выше оно пропущено.
Last edited by Shmuel on Wed 22 May, 2019 16:37, edited 1 time in total.
Как из lua-макроса определить битность системы?
Не проущено. Со скобками не работает. Почему - не знаю...
Last edited by 2useven10 on Wed 22 May, 2019 16:51, edited 1 time in total.
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Как из lua-макроса определить битность системы?
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.
Как из lua-макроса определить битность системы?
Shmuel, Не знаю в чём было дело, хоть мой код хоть исправленный не работал с невразумительной диагностикой.
После перезагрузки всё нормализовалось - на моём ошибка int -> int*, исправленный работает.
После перезагрузки всё нормализовалось - на моём ошибка int -> int*, исправленный работает.
Last edited by 2useven10 on Wed 22 May, 2019 18:57, edited 2 times in total.
Как из lua-макроса определить битность системы?
Спасибо, у меня получилось так, с теоретической поддержкой Windows XP:
А теперь - следующий вопрос Как функцию IsWindows64bit() сделать доступной для вызова из FarMenu.Ini ?
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
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Как из lua-макроса определить битность системы?
Code: Select all
cmd /c "if defined ProgramFiles(x86) (echo 64-bit OS) else echo 32-bit OS"
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Как из lua-макроса определить битность системы?
Зависит от того, каким образом вы собираетесь это использовать
Как из lua-макроса определить битность системы?
В своё время я делал это так: По-моему, проще, чем через ffi.
Как из lua-макроса определить битность системы?
Я предполагаю, что функция IsWindows64bit() живёт в одном из файлов .lua в папке скриптов, и для того, чтобы эта функция была видна извне, её нужно определить специальным образом (?).
Вызывать её в FarMenu.Ini предполагаю с помощью
Code: Select all
lua:if IsWindows64bit() then ... end
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Как из lua-макроса определить битность системы?
Самый простой способ - определить эту функцию как глобальную, то есть вместо
local function IsWindows64bit()
написать function _G.IsWindows64bit()
.