package.loadlib() vs alien

package.loadlib()でのWin32API呼び出しは、うまくいかなかった。恐らくWin32APIの呼び出し規約がstdcallだからだろう。しかし、呼び出し規約がcdeclのprintfを呼び出しても、文字化けしてうまくいかなかった。型を指定していないからだろうか。alienを使用すると、型や呼び出し規約を指定できるので、うまくいく。

require "alien"

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

local f = alien.msvcrt.printf
f:types{ ret = 'long', abi = 'cdecl', 'string' }
f("Hello, World!")