Lua Memo

外部ライブラリ(DLL)にある関数を実行する

alien (ありえん!) ではなく、エーリアン、つまり、動的にライブラリをロードして実行するライブラリ。

Windows で MessageBox を使う例

require( "alien" )
local mb = alien.User32.MessageBoxA
mb:types{ ret = 'long', abi = 'stdcall', 'long', 'string', 'string', 'long' }
print(mb(0, "Hello World!", "test", 64))

環境変数を展開して取得する(%USERPROFILE%の値を取得する)例

local eev = alien.Kernel32.ExpandEnvironmentStringsA
eev:types{ ret = "long", abi = 'stdcall', "string", "pointer", "long" }
local buffer = alien.buffer(512)
eev("%USERPROFILE%", buffer, 512)
print(tostring(buffer))

コールバック関数も使える!

Windows API の EnumWindows を使う例

require 'alien'
-- API
EnumWindows = alien.user32.EnumWindows
EnumWindows:types {"callback", "pointer", abi="stdcall"}

GetClassName = alien.user32.GetClassNameA
GetClassName:types {"long", "pointer", "int", abi="stdcall" }

-- callback
local buf = alien.buffer(512)
local function enum_func(hwnd, p)
  GetClassName(hwnd, buf, 511)
  print (hwnd..":"..tostring(buf))
  return 1
end
local callback_func = alien.callback(
	enum_func,
	{"int", "pointer", abi="stdcall"})
-- call
EnumWindows(callback_func, nil)