Archive for the ‘Lua’ Category

  1. Hello, Win32 GUI(Lua) World!

    Posted on 7月 16th, 2012 by cx20

    Win32 GUI(Lua)

    Win32 アプリケーションは Windows 標準 API である Win32 API を使用した Windows アプリケーションである。
    以下は Lua にて alien ライブラリを使用した Win32 GUI アプリケーション の例となっている。

    ソースコード

    require 'alien'
     
    WS_OVERLAPPED       = 0x00000000
    WS_CAPTION          = 0x00C00000
    WS_SYSMENU          = 0x00080000
    WS_THICKFRAME       = 0x00040000
    WS_MINIMIZEBOX      = 0x00020000
    WS_MAXIMIZEBOX      = 0x00010000 
    WS_OVERLAPPEDWINDOW = WS_OVERLAPPED + WS_CAPTION + WS_SYSMENU + WS_THICKFRAME + WS_MINIMIZEBOX + WS_MAXIMIZEBOX
     
    WM_DESTROY    = 0x0002
    WM_SIZE       = 0x0005
    WM_CLOSE      = 0x0010
    WM_PAINT      = 0x000F
     
    CW_USEDEFAULT = 0x80000000
    SW_SHOWNORMAL = 1
     
    BLACK_BRUSH   = 4
    COLOR_WINDOW  = 5
     
    POINTAPI = alien.defstruct{
        {"x", "long"};
        {"y", "long"};
    }
     
    MSG = alien.defstruct{
        {"hwnd", "pointer"};
        {"message", "uint"};
        {"wParam", "pointer"};
        {"lParam", "pointer"};
        {"time", "ulong"};
        {"x", "long"};
        {"y", "long"};
    }
     
    WNDCLASSEX = alien.defstruct{
        {"cbSize", "uint"};
        {"style", "uint"};
        {"lpfnWndProc", "callback"};
        {"cbClsExtra", "int"};
        {"cbWndExtra", "int"};
        {"hInstance", "pointer"};
        {"hIcon", "pointer"};
        {"hCursor", "pointer"};
        {"hbrBackground", "pointer"};
        {"lpszMenuName", "string"};
        {"lpszClassName", "string"};
        {"hIconSm", "pointer"};
    }
     
    RECT = alien.defstruct{
        {"Left", "long"};
        {"Top", "long"};
        {"Right", "long"};
        {"Bottom", "long"};
    }
     
    PAINTSTRUCT = alien.defstruct{
      {"hdc", "uint"};
      {"fErase", "int"};
      {"rcPaint_left", "long"};
      {"rcPaint_top", "long"};
      {"rcPaint_right", "long"};
      {"rcPaint_bottom", "long"};
      {"fRestore", "int"};
      {"fIncUpdate", "int"};
      --[[ {"rgbReserved", "byte[32]"}; ]]
    }
    PAINTSTRUCT.size = PAINTSTRUCT.size + 32
     
    RegisterClassEx  = alien.user32.RegisterClassExA; RegisterClassEx:types{ ret = "ushort", abi = "stdcall"; "pointer" }
    DestroyWindow    = alien.user32.DestroyWindow;    DestroyWindow:types{ ret = "int", abi = "stdcall"; "pointer" }
    PostQuitMessage  = alien.user32.PostQuitMessage;  PostQuitMessage:types{ ret = "void", abi = "stdcall"; "int" }
    DefWindowProc    = alien.user32.DefWindowProcA;   DefWindowProc:types{ ret = "long", abi = "stdcall"; "pointer", "uint", "uint", "long" }
    GetMessage       = alien.user32.GetMessageA;      GetMessage:types{ ret = "int", abi = "stdcall"; "pointer", "pointer", "uint", "uint" }
    TranslateMessage = alien.user32.TranslateMessage; TranslateMessage:types{ ret = "int", abi = "stdcall"; "pointer" }
    DispatchMessage  = alien.user32.DispatchMessageA; DispatchMessage:types{ ret = "int", abi = "stdcall"; "pointer" }
    CreateWindowEx   = alien.user32.CreateWindowExA;  CreateWindowEx:types{ ret = "pointer", abi = "stdcall"; "ulong", "string", "string", "ulong", "int", "int", "int", "int", "pointer", "pointer", "pointer" }
    ShowWindow       = alien.user32.ShowWindow;       ShowWindow:types{ ret = "int", abi = "stdcall"; "pointer", "int" }
    UpdateWindow     = alien.user32.UpdateWindow;     UpdateWindow:types{ ret = "int", abi = "stdcall"; "pointer" }
    BeginPaint       = alien.user32.BeginPaint;       BeginPaint:types{ ret = "pointer", abi = "stdcall"; "pointer", "pointer" }
    EndPaint         = alien.user32.EndPaint;         EndPaint:types{ ret = "int", abi = "stdcall"; "long", "pointer" }
    TextOut          = alien.gdi32.TextOutA;          TextOut:types{ ret = "int", abi = "stdcall"; "pointer", "int", "int", "string", "int" }
    GetStockObject   = alien.gdi32.GetStockObject;    GetStockObject:types{ ret = "pointer", abi = "stdcall"; "int" }
     
    CLASS_NAME = "helloWindow"
    WINDOW_NAME = "Hello, World"
     
    function WndProc(hwnd, uMsg, wParam, lParam)
        ps = PAINTSTRUCT:new()
        strMessage = string.format("Hello, Win32 GUI(Lua) World!")
        if (uMsg == WM_DESTROY) then
            PostQuitMessage(0)
        elseif (uMsg == WM_PAINT) then
            hdc = BeginPaint( hwnd, ps() )
            TextOut( hdc, 0, 0, strMessage, string.len(strMessage) )
            EndPaint( hwnd, ps() )
        else
            return DefWindowProc(hwnd, uMsg, wParam, lParam)
        end
        return nil
    end
     
    function WinMain()
        wcex = WNDCLASSEX:new()
        wcex.cbSize        = WNDCLASSEX.size
        wcex.style         = 0
        wcex.lpfnWndProc   = alien.callback(WndProc, { ret = "long", abi = "stdcall"; "pointer", "uint", "uint", "long" })
        wcex.cbClsExtra    = 0
        wcex.cbWndExtra    = 0
        wcex.hInstance     = nil
        wcex.hIcon         = nil
        wcex.hCursor       = nil
        wcex.hbrBackground = GetStockObject(COLOR_WINDOW+1)
        wcex.lpszMenuName  = nil
        wcex.lpszClassName = CLASS_NAME
        wcex.hIconSm       = nil
     
        RegisterClassEx(wcex())
     
        hwnd = CreateWindowEx(
            0,
            CLASS_NAME,
            WINDOW_NAME,
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            640,
            480,
            nil,
            nil,
            nil)
     
        ShowWindow(hwnd, SW_SHOWNORMAL)
        UpdateWindow(hwnd)
     
        msg = MSG:new()
        msg_ptr = msg()
     
        while (GetMessage(msg_ptr, nil, 0, 0) ~= 0) do
            TranslateMessage(msg_ptr)
            DispatchMessage(msg_ptr)
        end
    end
     
    function main()
        WinMain()
    end
     
    main()

    実行方法

    C:¥> wlua hello.lua

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(Lua) World!              |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  2. Hello, COM(Lua) World!

    Posted on 5月 26th, 2012 by cx20

    COM(Lua)

    COM(Component Object Model)はマイクロソフトの提唱するプログラム部品の仕様である。
    COM を用いて開発された部品であれば言語を問わず利用することができる。
    以下は Lua による COM クライアントの例となっている。

    ソースコード

    require "luacom"
     
    shell = luacom.CreateObject("Shell.Application")
    folder = shell:BrowseForFolder( 0, "Hello, COM(LUA) World!", 0, 36 )

    実行方法

    C:¥> lua hello.lua

    実行結果

    +----------------------------------------+
    |Browse For Folder                    [X]|
    +----------------------------------------+
    | Hello, COM(Lua) Wolrd!                 |
    |                                        |
    | +------------------------------------+ |
    | |[Windows]                           | |
    | | +[addins]                          | |
    | | +[AppCompat]                       | |
    | | +[AppPatch]                        | |
    | | +[assembly]                        | |
    | |     :                              | |
    | |     :                              | |
    | |     :                              | |
    | +------------------------------------+ |
    | [Make New Folder]    [  OK  ] [Cancel] |
    +----------------------------------------+
  3. Hello, Win32 API(Lua) World!

    Posted on 4月 30th, 2012 by cx20

    Win32 API(Lua)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は Lua にて alien ライブラリを用いた呼出し例である。

    ソースコード

    require "alien"
     
    MessageBox = alien.User32.MessageBoxA
    MessageBox:types{ ret = 'long', abi = 'stdcall', 'long', 'string', 'string', 'long' }
    MessageBox( 0, "Hello, Win32 API(Lua) World!", "Hello, World!", 0 )

    Win32 データ型に対応する Lua の型(alien ライブラリ)としては以下のようなものがある。

    Win32 データ型 C/C++ データ型 Lua
    VOID void void
    INT int int
    UINT unsigned int uint
    DOUBLE double double
    CHAR char char
    LPCSTR const char * string
    LPVOID void * pointer
    PINT int * ref int
    PUINT unsigned int * ref uint
    DOUBLE * double * ref double
    PCHAR char * ref char
    PROC function pointer callback
    SHORT short short
    WORD unsigned short ushort
    BYTE signed char byte
    LONG long long
    DWORD unsigned long ulong
    FLOAT float float

    実行方法

    C:¥> lua hello.lua

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API(Lua) World!
    ---------------------------
    OK   
    ---------------------------
  4. Hello, Lua World!

    Posted on 1月 13th, 2012 by cx20

    Lua

    Lua は軽量で速さに定評のあるスクリプト言語である。名前はポルトガル語で月を意味する。
    構文は Pascal に似ており、他のスクリプト言語(Python や Ruby 等)よりも高速に動作するという特徴を持つ。
    C言語の組み込み言語として設計されており、ゲーム開発におけるイベントスクリプトやヤマハのルータの組み込み言語等にも利用されている。また、最近、iPhone SDK の利用規約が少し緩くなったことにより、iPhone アプリの開発に利用されるケースも増えている。

    ソースコード

    #!/usr/local/bin/lua
    print "Hello, Lua World!"

    実行方法(スクリプトファイルを指定して実行)

    $ lua hello.lua

    実行方法(実行権限を付与して実行)

    $ chmod +x hello.lua
    $ ./hello.lua

    コンパイル&実行方法(バイトコードにコンパイルして実行)

    $ luac -o hello.luac hello.lua
    $ lua hello.luac

    実行結果

    Hello, Lua World!