Archive for the ‘Win32 GUI’ Category

  1. Hello, Win32 GUI(Perl) World!

    Posted on 7月 13th, 2012 by cx20

    Win32 GUI(Perl)

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

    ソースコード

    use Win32::GUI();
     
    $main = Win32::GUI::Window->new( 
        -text => "Hello, world" );
     
    $label = $main->AddLabel( 
        -text => "Hello, Win32 GUI(Perl) World!" );
     
    $main->Resize(640, 480);
    $main->Show();
     
    Win32::GUI::Dialog();

    実行方法

    C:¥> perl hello.pl

    実行結果

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

    Posted on 7月 12th, 2012 by cx20

    Win32 GUI(PowerShell)

    Win32 アプリケーションは Windows 標準 API である Win32 API を使用した Windows アプリケーションである。
    以下は PowerShell にて Add-Type コマンドレット経由で C# を呼び出すことにより Win32 API を使用した GUI アプリケーション の例となっている。

    ソースコード

    $source = @"
    using System;
    using System.Runtime.InteropServices;
     
    public class Hello
    {
        [StructLayout(LayoutKind.Sequential)]
        struct POINT
        {
            public int x;
            public int y;
        }
     
        [StructLayout(LayoutKind.Sequential)]
        struct MSG
        {
            public IntPtr hwnd;
            public uint message;
            public IntPtr wParam;
            public IntPtr lParam;
            public uint time;
            public POINT pt;
        }
     
        delegate IntPtr WndProcDelgate(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct WNDCLASSEX
        {
            public uint cbSize;
            public uint style;
            public WndProcDelgate lpfnWndProc;
            public Int32 cbClsExtra;
            public Int32 cbWndExtra;
            public IntPtr hInstance;
            public IntPtr hIcon;
            public IntPtr hCursor;
            public IntPtr hbrBackground;
            public string lpszMenuName;
            public string lpszClassName;
            public IntPtr hIconSm;
        }
     
        [StructLayout(LayoutKind.Sequential)]
        struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
     
        [StructLayout(LayoutKind.Sequential)]
        struct PAINTSTRUCT
        {
            public IntPtr hdc;
            public int fErase;
            public RECT rcPaint;
            public int fRestore;
            public int fIncUpdate;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public byte[] rgbReserved;
        }
     
        const uint WS_OVERLAPPED = 0x00000000;
        const uint WS_POPUP = 0x80000000;
        const uint WS_CHILD = 0x40000000;
        const uint WS_MINIMIZE = 0x20000000;
        const uint WS_VISIBLE = 0x10000000;
        const uint WS_DISABLED = 0x08000000;
        const uint WS_CLIPSIBLINGS = 0x04000000;
        const uint WS_CLIPCHILDREN = 0x02000000;
        const uint WS_MAXIMIZE = 0x01000000;
        const uint WS_CAPTION = 0x00C00000; // WS_BORDER | WS_DLGFRAME
        const uint WS_BORDER = 0x00800000;
        const uint WS_DLGFRAME = 0x00400000;
        const uint WS_VSCROLL = 0x00200000;
        const uint WS_HSCROLL = 0x00100000;
        const uint WS_SYSMENU = 0x00080000;
        const uint WS_THICKFRAME = 0x00040000;
        const uint WS_GROUP = 0x00020000;
        const uint WS_TABSTOP = 0x00010000;
     
        const uint WS_MINIMIZEBOX = 0x00020000;
        const uint WS_MAXIMIZEBOX = 0x00010000;
     
        const uint WS_TILED = WS_OVERLAPPED;
        const uint WS_ICONIC = WS_MINIMIZE;
        const uint WS_SIZEBOX = WS_THICKFRAME;
        const uint WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW;
     
        const uint WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
        const uint WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU;
        const uint WS_CHILDWINDOW = WS_CHILD;
     
        const uint WM_CREATE = 0x0001;
        const uint WM_DESTROY = 0x0002;
        const uint WM_PAINT = 0x000F;
        const uint WM_CLOSE = 0x0010;
        const uint WM_COMMAND = 0x0111;
     
        const uint COLOR_WINDOW = 5;
        const uint COLOR_BTNFACE = 15;
     
        const uint CS_VREDRAW = 0x0001;
        const uint CS_HREDRAW = 0x0002;
     
        const int CW_USEDEFAULT = -2147483648; // ((uint)0x80000000)
     
        const uint SW_SHOWDEFAULT = 10;
     
        const int IDI_APPLICATION = 32512;
        const int IDC_ARROW = 32512;
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr LoadCursor(IntPtr hInstance, IntPtr lpCursorName);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr LoadIcon(IntPtr hInstance, IntPtr lpIconName);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern short RegisterClassEx(ref WNDCLASSEX pcWndClassEx);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr CreateWindowEx(uint dwExStyle, string lpClassName, string lpWindowName, uint dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern bool UpdateWindow(IntPtr hWnd);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern int GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern int TranslateMessage([In] ref MSG lpMsg);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr DispatchMessage([In] ref MSG lpMsg);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern void PostQuitMessage(int nExitCode);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr BeginPaint(IntPtr hWnd, out PAINTSTRUCT lpPaint);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr EndPaint(IntPtr hWnd, ref PAINTSTRUCT lpPaint);
     
        [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr TextOut( IntPtr hdc, int x, int y, string lpString, int nCount );
     
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr GetModuleHandle(string lpModuleName);
     
        static IntPtr WndProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
        {
            PAINTSTRUCT ps = new PAINTSTRUCT();
            IntPtr hdc;
            string strMessage = "Hello, Win32 GUI(PowerShell) World!";
     
            switch (uMsg)
            {
                case WM_PAINT:
                    hdc = BeginPaint( hWnd, out ps );
                    TextOut( hdc, 0, 0, strMessage, strMessage.Length );
                    EndPaint( hWnd, ref ps );
                    break;
                case WM_DESTROY:
                    PostQuitMessage(0);
                    break;
                default:
                    return DefWindowProc(hWnd, uMsg, wParam, lParam);
            }
     
            return IntPtr.Zero;
        }
     
        static int WinMain()
        {
            IntPtr hInstance = Marshal.GetHINSTANCE(typeof(Hello).Module);
            const string CLASS_NAME = "helloWindow";
            const string WINDOW_NAME = "Hello, World!";
     
            WNDCLASSEX wcex = new WNDCLASSEX();
            wcex.cbSize = (uint)Marshal.SizeOf(wcex);
            wcex.style = CS_HREDRAW | CS_VREDRAW;
            wcex.lpfnWndProc = new WndProcDelgate(WndProc);
            wcex.cbClsExtra = 0;
            wcex.cbWndExtra = 0;
            wcex.hInstance = hInstance;
            wcex.hIcon = LoadIcon(hInstance, new IntPtr(IDI_APPLICATION));
            wcex.hCursor = LoadIcon(hInstance, new IntPtr(IDC_ARROW));
            wcex.hbrBackground = new IntPtr(COLOR_WINDOW + 1);
            wcex.lpszMenuName = "";
            wcex.lpszClassName = CLASS_NAME;
            wcex.hIconSm = IntPtr.Zero;
     
            RegisterClassEx(ref wcex);
     
            IntPtr hWnd = CreateWindowEx(
                0,
                wcex.lpszClassName,
                WINDOW_NAME,
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                640,
                480,
                IntPtr.Zero,
                IntPtr.Zero,
                wcex.hInstance,
                IntPtr.Zero);
     
            ShowWindow(hWnd, SW_SHOWDEFAULT);
            UpdateWindow(hWnd);
     
            MSG msg = new MSG();
            while (GetMessage(out msg, IntPtr.Zero, 0, 0) != 0)
            {
                TranslateMessage(ref msg);
                DispatchMessage(ref msg);
            }
     
            return (int)msg.wParam;
        }
     
        [STAThread]
        public static int Main()
        {
            return WinMain();
        }
    }
    "@
    Add-Type -Language CSharp -TypeDefinition $source -ReferencedAssemblies ("System.Drawing", "System.Windows.Forms" )
    [void][Hello]::Main()

    実行方法

    C:¥> powershell -file Hello.ps1

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(PowerShell) World!       |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  3. Hello, Win32 GUI(MSIL) World!

    Posted on 7月 11th, 2012 by cx20

    Win32 GUI(MSIL)

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

    ソースコード

    //  Microsoft (R) .NET Framework IL Disassembler.  Version 4.0.30319.1
    //  Copyright (c) Microsoft Corporation. All rights reserved.
     
    // Metadata version: v2.0.50727
    .module extern user32.dll
    .module extern gdi32.dll
    .module extern kernel32.dll
    .assembly extern mscorlib
    {
      .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .zV.4..
      .ver 2:0:0:0
    }
    .assembly Hello
    {
      .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) 
      .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
                                                                                                                 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
      .hash algorithm 0x00008004
      .ver 0:0:0:0
    }
    .module Hello.exe
    // MVID: {BEAF0F56-F7B6-4F51-B26E-C0D153A452A2}
    .imagebase 0x00400000
    .file alignment 0x00000200
    .stackreserve 0x00100000
    .subsystem 0x0002       // WINDOWS_GUI
    .corflags 0x00000001    //  ILONLY
    // Image base: 0x00410000
     
     
    // =============== CLASS MEMBERS DECLARATION ===================
     
    .class private auto ansi beforefieldinit Hello
           extends [mscorlib]System.Object
    {
      .class sequential ansi sealed nested private beforefieldinit POINT
             extends [mscorlib]System.ValueType
      {
        .field public int32 x
        .field public int32 y
      } // end of class POINT
     
      .class sequential ansi sealed nested private beforefieldinit MSG
             extends [mscorlib]System.ValueType
      {
        .field public native int hwnd
        .field public uint32 message
        .field public native int wParam
        .field public native int lParam
        .field public uint32 time
        .field public valuetype Hello/POINT pt
      } // end of class MSG
     
      .class auto ansi sealed nested private WndProcDelgate
             extends [mscorlib]System.MulticastDelegate
      {
        .method public hidebysig specialname rtspecialname 
                instance void  .ctor(object 'object',
                                     native int 'method') runtime managed
        {
        } // end of method WndProcDelgate::.ctor
     
        .method public hidebysig newslot virtual 
                instance native int  Invoke(native int hWnd,
                                            uint32 uMsg,
                                            native int wParam,
                                            native int lParam) runtime managed
        {
        } // end of method WndProcDelgate::Invoke
     
        .method public hidebysig newslot virtual 
                instance class [mscorlib]System.IAsyncResult 
                BeginInvoke(native int hWnd,
                            uint32 uMsg,
                            native int wParam,
                            native int lParam,
                            class [mscorlib]System.AsyncCallback callback,
                            object 'object') runtime managed
        {
        } // end of method WndProcDelgate::BeginInvoke
     
        .method public hidebysig newslot virtual 
                instance native int  EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed
        {
        } // end of method WndProcDelgate::EndInvoke
     
      } // end of class WndProcDelgate
     
      .class sequential autochar sealed nested private beforefieldinit WNDCLASSEX
             extends [mscorlib]System.ValueType
      {
        .field public uint32 cbSize
        .field public uint32 style
        .field public class Hello/WndProcDelgate lpfnWndProc
        .field public int32 cbClsExtra
        .field public int32 cbWndExtra
        .field public native int hInstance
        .field public native int hIcon
        .field public native int hCursor
        .field public native int hbrBackground
        .field public string lpszMenuName
        .field public string lpszClassName
        .field public native int hIconSm
      } // end of class WNDCLASSEX
     
      .class sequential ansi sealed nested private beforefieldinit RECT
             extends [mscorlib]System.ValueType
      {
        .field public int32 Left
        .field public int32 Top
        .field public int32 Right
        .field public int32 Bottom
      } // end of class RECT
     
      .class sequential ansi sealed nested private beforefieldinit PAINTSTRUCT
             extends [mscorlib]System.ValueType
      {
        .field public native int hdc
        .field public int32 fErase
        .field public valuetype Hello/RECT rcPaint
        .field public int32 fRestore
        .field public int32 fIncUpdate
        .field public  marshal( fixed array [32]) uint8[] rgbReserved
      } // end of class PAINTSTRUCT
     
      .field private static literal uint32 WS_OVERLAPPED = uint32(0x00000000)
      .field private static literal uint32 WS_POPUP = uint32(0x80000000)
      .field private static literal uint32 WS_CHILD = uint32(0x40000000)
      .field private static literal uint32 WS_MINIMIZE = uint32(0x20000000)
      .field private static literal uint32 WS_VISIBLE = uint32(0x10000000)
      .field private static literal uint32 WS_DISABLED = uint32(0x08000000)
      .field private static literal uint32 WS_CLIPSIBLINGS = uint32(0x04000000)
      .field private static literal uint32 WS_CLIPCHILDREN = uint32(0x02000000)
      .field private static literal uint32 WS_MAXIMIZE = uint32(0x01000000)
      .field private static literal uint32 WS_CAPTION = uint32(0x00C00000)
      .field private static literal uint32 WS_BORDER = uint32(0x00800000)
      .field private static literal uint32 WS_DLGFRAME = uint32(0x00400000)
      .field private static literal uint32 WS_VSCROLL = uint32(0x00200000)
      .field private static literal uint32 WS_HSCROLL = uint32(0x00100000)
      .field private static literal uint32 WS_SYSMENU = uint32(0x00080000)
      .field private static literal uint32 WS_THICKFRAME = uint32(0x00040000)
      .field private static literal uint32 WS_GROUP = uint32(0x00020000)
      .field private static literal uint32 WS_TABSTOP = uint32(0x00010000)
      .field private static literal uint32 WS_MINIMIZEBOX = uint32(0x00020000)
      .field private static literal uint32 WS_MAXIMIZEBOX = uint32(0x00010000)
      .field private static literal uint32 WS_TILED = uint32(0x00000000)
      .field private static literal uint32 WS_ICONIC = uint32(0x20000000)
      .field private static literal uint32 WS_SIZEBOX = uint32(0x00040000)
      .field private static literal uint32 WS_TILEDWINDOW = uint32(0x00CF0000)
      .field private static literal uint32 WS_OVERLAPPEDWINDOW = uint32(0x00CF0000)
      .field private static literal uint32 WS_POPUPWINDOW = uint32(0x80880000)
      .field private static literal uint32 WS_CHILDWINDOW = uint32(0x40000000)
      .field private static literal uint32 WM_CREATE = uint32(0x00000001)
      .field private static literal uint32 WM_DESTROY = uint32(0x00000002)
      .field private static literal uint32 WM_PAINT = uint32(0x0000000F)
      .field private static literal uint32 WM_CLOSE = uint32(0x00000010)
      .field private static literal uint32 WM_COMMAND = uint32(0x00000111)
      .field private static literal uint32 COLOR_WINDOW = uint32(0x00000005)
      .field private static literal uint32 COLOR_BTNFACE = uint32(0x0000000F)
      .field private static literal uint32 CS_VREDRAW = uint32(0x00000001)
      .field private static literal uint32 CS_HREDRAW = uint32(0x00000002)
      .field private static literal int32 CW_USEDEFAULT = int32(0x80000000)
      .field private static literal uint32 SW_SHOWDEFAULT = uint32(0x0000000A)
      .field private static literal int32 IDI_APPLICATION = int32(0x00007F00)
      .field private static literal int32 IDC_ARROW = int32(0x00007F00)
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              native int  LoadCursor(native int hInstance,
                                     native int lpCursorName) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              native int  LoadIcon(native int hInstance,
                                   native int lpIconName) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              int16  RegisterClassEx(valuetype Hello/WNDCLASSEX& pcWndClassEx) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              native int  CreateWindowEx(uint32 dwExStyle,
                                         string lpClassName,
                                         string lpWindowName,
                                         uint32 dwStyle,
                                         int32 x,
                                         int32 y,
                                         int32 nWidth,
                                         int32 nHeight,
                                         native int hWndParent,
                                         native int hMenu,
                                         native int hInstance,
                                         native int lpParam) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              bool  ShowWindow(native int hWnd,
                               uint32 nCmdShow) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              bool  UpdateWindow(native int hWnd) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              int32  GetMessage([out] valuetype Hello/MSG& lpMsg,
                                native int hWnd,
                                uint32 wMsgFilterMin,
                                uint32 wMsgFilterMax) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              int32  TranslateMessage([in] valuetype Hello/MSG& lpMsg) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              native int  DispatchMessage([in] valuetype Hello/MSG& lpMsg) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              void  PostQuitMessage(int32 nExitCode) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              native int  DefWindowProc(native int hWnd,
                                        uint32 uMsg,
                                        native int wParam,
                                        native int lParam) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              native int  BeginPaint(native int hWnd,
                                     [out] valuetype Hello/PAINTSTRUCT& lpPaint) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("user32.dll" autochar winapi) 
              native int  EndPaint(native int hWnd,
                                   valuetype Hello/PAINTSTRUCT& lpPaint) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("gdi32.dll" autochar winapi) 
              native int  TextOut(native int hdc,
                                  int32 x,
                                  int32 y,
                                  string lpString,
                                  int32 nCount) cil managed preservesig
      {
      }
      .method private hidebysig static pinvokeimpl("kernel32.dll" autochar winapi) 
              native int  GetModuleHandle(string lpModuleName) cil managed preservesig
      {
      }
      .method private hidebysig static native int 
              WndProc(native int hWnd,
                      uint32 uMsg,
                      native int wParam,
                      native int lParam) cil managed
      {
        // コード サイズ       98 (0x62)
        .maxstack  5
        .locals init (valuetype Hello/PAINTSTRUCT V_0,
                 native int V_1,
                 string V_2,
                 native int V_3,
                 uint32 V_4)
        IL_0000:  nop
        IL_0001:  ldloca.s   V_0
        IL_0003:  initobj    Hello/PAINTSTRUCT
        IL_0009:  ldstr      "Hello, Win32 GUI(MSIL) World!"
        IL_000e:  stloc.2
        IL_000f:  ldarg.1
        IL_0010:  stloc.s    V_4
        IL_0012:  ldloc.s    V_4
        IL_0014:  ldc.i4.2
        IL_0015:  beq.s      IL_0043
     
        IL_0017:  ldloc.s    V_4
        IL_0019:  ldc.i4.s   15
        IL_001b:  beq.s      IL_001f
     
        IL_001d:  br.s       IL_004c
     
        IL_001f:  ldarg.0
        IL_0020:  ldloca.s   V_0
        IL_0022:  call       native int Hello::BeginPaint(native int,
                                                          valuetype Hello/PAINTSTRUCT&)
        IL_0027:  stloc.1
        IL_0028:  ldloc.1
        IL_0029:  ldc.i4.0
        IL_002a:  ldc.i4.0
        IL_002b:  ldloc.2
        IL_002c:  ldloc.2
        IL_002d:  callvirt   instance int32 [mscorlib]System.String::get_Length()
        IL_0032:  call       native int Hello::TextOut(native int,
                                                       int32,
                                                       int32,
                                                       string,
                                                       int32)
        IL_0037:  pop
        IL_0038:  ldarg.0
        IL_0039:  ldloca.s   V_0
        IL_003b:  call       native int Hello::EndPaint(native int,
                                                        valuetype Hello/PAINTSTRUCT&)
        IL_0040:  pop
        IL_0041:  br.s       IL_0058
     
        IL_0043:  ldc.i4.0
        IL_0044:  call       void Hello::PostQuitMessage(int32)
        IL_0049:  nop
        IL_004a:  br.s       IL_0058
     
        IL_004c:  ldarg.0
        IL_004d:  ldarg.1
        IL_004e:  ldarg.2
        IL_004f:  ldarg.3
        IL_0050:  call       native int Hello::DefWindowProc(native int,
                                                             uint32,
                                                             native int,
                                                             native int)
        IL_0055:  stloc.3
        IL_0056:  br.s       IL_0060
     
        IL_0058:  ldsfld     native int [mscorlib]System.IntPtr::Zero
        IL_005d:  stloc.3
        IL_005e:  br.s       IL_0060
     
        IL_0060:  ldloc.3
        IL_0061:  ret
      } // end of method Hello::WndProc
     
      .method private hidebysig static int32 
              WinMain(string[] args) cil managed
      {
        // コード サイズ       358 (0x166)
        .maxstack  12
        .locals init (native int V_0,
                 valuetype Hello/WNDCLASSEX V_1,
                 native int V_2,
                 valuetype Hello/MSG V_3,
                 int32 V_4,
                 bool V_5)
        IL_0000:  nop
        IL_0001:  ldtoken    Hello
        IL_0006:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
        IL_000b:  callvirt   instance class [mscorlib]System.Reflection.Module [mscorlib]System.Type::get_Module()
        IL_0010:  call       native int [mscorlib]System.Runtime.InteropServices.Marshal::GetHINSTANCE(class [mscorlib]System.Reflection.Module)
        IL_0015:  stloc.0
        IL_0016:  ldloca.s   V_1
        IL_0018:  initobj    Hello/WNDCLASSEX
        IL_001e:  ldloca.s   V_1
        IL_0020:  ldloc.1
        IL_0021:  box        Hello/WNDCLASSEX
        IL_0026:  call       int32 [mscorlib]System.Runtime.InteropServices.Marshal::SizeOf(object)
        IL_002b:  stfld      uint32 Hello/WNDCLASSEX::cbSize
        IL_0030:  ldloca.s   V_1
        IL_0032:  ldc.i4.3
        IL_0033:  stfld      uint32 Hello/WNDCLASSEX::style
        IL_0038:  ldloca.s   V_1
        IL_003a:  ldnull
        IL_003b:  ldftn      native int Hello::WndProc(native int,
                                                       uint32,
                                                       native int,
                                                       native int)
        IL_0041:  newobj     instance void Hello/WndProcDelgate::.ctor(object,
                                                                       native int)
        IL_0046:  stfld      class Hello/WndProcDelgate Hello/WNDCLASSEX::lpfnWndProc
        IL_004b:  ldloca.s   V_1
        IL_004d:  ldc.i4.0
        IL_004e:  stfld      int32 Hello/WNDCLASSEX::cbClsExtra
        IL_0053:  ldloca.s   V_1
        IL_0055:  ldc.i4.0
        IL_0056:  stfld      int32 Hello/WNDCLASSEX::cbWndExtra
        IL_005b:  ldloca.s   V_1
        IL_005d:  ldloc.0
        IL_005e:  stfld      native int Hello/WNDCLASSEX::hInstance
        IL_0063:  ldloca.s   V_1
        IL_0065:  ldloc.0
        IL_0066:  ldc.i4     0x7f00
        IL_006b:  newobj     instance void [mscorlib]System.IntPtr::.ctor(int32)
        IL_0070:  call       native int Hello::LoadIcon(native int,
                                                        native int)
        IL_0075:  stfld      native int Hello/WNDCLASSEX::hIcon
        IL_007a:  ldloca.s   V_1
        IL_007c:  ldloc.0
        IL_007d:  ldc.i4     0x7f00
        IL_0082:  newobj     instance void [mscorlib]System.IntPtr::.ctor(int32)
        IL_0087:  call       native int Hello::LoadIcon(native int,
                                                        native int)
        IL_008c:  stfld      native int Hello/WNDCLASSEX::hCursor
        IL_0091:  ldloca.s   V_1
        IL_0093:  ldc.i4.6
        IL_0094:  conv.i8
        IL_0095:  newobj     instance void [mscorlib]System.IntPtr::.ctor(int64)
        IL_009a:  stfld      native int Hello/WNDCLASSEX::hbrBackground
        IL_009f:  ldloca.s   V_1
        IL_00a1:  ldstr      ""
        IL_00a6:  stfld      string Hello/WNDCLASSEX::lpszMenuName
        IL_00ab:  ldloca.s   V_1
        IL_00ad:  ldstr      "helloWindow"
        IL_00b2:  stfld      string Hello/WNDCLASSEX::lpszClassName
        IL_00b7:  ldloca.s   V_1
        IL_00b9:  ldsfld     native int [mscorlib]System.IntPtr::Zero
        IL_00be:  stfld      native int Hello/WNDCLASSEX::hIconSm
        IL_00c3:  ldloca.s   V_1
        IL_00c5:  call       int16 Hello::RegisterClassEx(valuetype Hello/WNDCLASSEX&)
        IL_00ca:  pop
        IL_00cb:  ldc.i4.0
        IL_00cc:  ldloca.s   V_1
        IL_00ce:  ldfld      string Hello/WNDCLASSEX::lpszClassName
        IL_00d3:  ldstr      "Hello, World!"
        IL_00d8:  ldc.i4     0xcf0000
        IL_00dd:  ldc.i4     0x80000000
        IL_00e2:  ldc.i4     0x80000000
        IL_00e7:  ldc.i4     0x280
        IL_00ec:  ldc.i4     0x1e0
        IL_00f1:  ldsfld     native int [mscorlib]System.IntPtr::Zero
        IL_00f6:  ldsfld     native int [mscorlib]System.IntPtr::Zero
        IL_00fb:  ldloca.s   V_1
        IL_00fd:  ldfld      native int Hello/WNDCLASSEX::hInstance
        IL_0102:  ldsfld     native int [mscorlib]System.IntPtr::Zero
        IL_0107:  call       native int Hello::CreateWindowEx(uint32,
                                                              string,
                                                              string,
                                                              uint32,
                                                              int32,
                                                              int32,
                                                              int32,
                                                              int32,
                                                              native int,
                                                              native int,
                                                              native int,
                                                              native int)
        IL_010c:  stloc.2
        IL_010d:  ldloc.2
        IL_010e:  ldc.i4.s   10
        IL_0110:  call       bool Hello::ShowWindow(native int,
                                                    uint32)
        IL_0115:  pop
        IL_0116:  ldloc.2
        IL_0117:  call       bool Hello::UpdateWindow(native int)
        IL_011c:  pop
        IL_011d:  ldloca.s   V_3
        IL_011f:  initobj    Hello/MSG
        IL_0125:  br.s       IL_0139
     
        IL_0127:  nop
        IL_0128:  ldloca.s   V_3
        IL_012a:  call       int32 Hello::TranslateMessage(valuetype Hello/MSG&)
        IL_012f:  pop
        IL_0130:  ldloca.s   V_3
        IL_0132:  call       native int Hello::DispatchMessage(valuetype Hello/MSG&)
        IL_0137:  pop
        IL_0138:  nop
        IL_0139:  ldloca.s   V_3
        IL_013b:  ldsfld     native int [mscorlib]System.IntPtr::Zero
        IL_0140:  ldc.i4.0
        IL_0141:  ldc.i4.0
        IL_0142:  call       int32 Hello::GetMessage(valuetype Hello/MSG&,
                                                     native int,
                                                     uint32,
                                                     uint32)
        IL_0147:  ldc.i4.0
        IL_0148:  ceq
        IL_014a:  ldc.i4.0
        IL_014b:  ceq
        IL_014d:  stloc.s    V_5
        IL_014f:  ldloc.s    V_5
        IL_0151:  brtrue.s   IL_0127
     
        IL_0153:  ldloca.s   V_3
        IL_0155:  ldfld      native int Hello/MSG::wParam
        IL_015a:  call       int32 [mscorlib]System.IntPtr::op_Explicit(native int)
        IL_015f:  stloc.s    V_4
        IL_0161:  br.s       IL_0163
     
        IL_0163:  ldloc.s    V_4
        IL_0165:  ret
      } // end of method Hello::WinMain
     
      .method private hidebysig static int32 
              Main(string[] args) cil managed
      {
        .entrypoint
        .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 
        // コード サイズ       12 (0xc)
        .maxstack  1
        .locals init (int32 V_0)
        IL_0000:  nop
        IL_0001:  ldarg.0
        IL_0002:  call       int32 Hello::WinMain(string[])
        IL_0007:  stloc.0
        IL_0008:  br.s       IL_000a
     
        IL_000a:  ldloc.0
        IL_000b:  ret
      } // end of method Hello::Main
     
      .method public hidebysig specialname rtspecialname 
              instance void  .ctor() cil managed
      {
        // コード サイズ       7 (0x7)
        .maxstack  8
        IL_0000:  ldarg.0
        IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
        IL_0006:  ret
      } // end of method Hello::.ctor
     
    } // end of class Hello
     
    // =============================================================
     
    // *********** 逆アセンブルが完了しました ***********************
    // 警告: Win32 リソース ファイル Hello.res を作成しました。

    上記コードは、以下の C# の実行ファイルを ildadm.exe で逆アセンブルしたものである。

    ソースコード

    using System;
    using System.Runtime.InteropServices;
     
    class Hello
    {
        [StructLayout(LayoutKind.Sequential)]
        struct POINT
        {
            public int x;
            public int y;
        }
     
        [StructLayout(LayoutKind.Sequential)]
        struct MSG
        {
            public IntPtr hwnd;
            public uint message;
            public IntPtr wParam;
            public IntPtr lParam;
            public uint time;
            public POINT pt;
        }
     
        delegate IntPtr WndProcDelgate(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct WNDCLASSEX
        {
            public uint cbSize;
            public uint style;
            public WndProcDelgate lpfnWndProc;
            public Int32 cbClsExtra;
            public Int32 cbWndExtra;
            public IntPtr hInstance;
            public IntPtr hIcon;
            public IntPtr hCursor;
            public IntPtr hbrBackground;
            public string lpszMenuName;
            public string lpszClassName;
            public IntPtr hIconSm;
        }
     
        [StructLayout(LayoutKind.Sequential)]
        struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
     
        [StructLayout(LayoutKind.Sequential)]
        struct PAINTSTRUCT
        {
            public IntPtr hdc;
            public int fErase;
            public RECT rcPaint;
            public int fRestore;
            public int fIncUpdate;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public byte[] rgbReserved;
        }
     
        const uint WS_OVERLAPPED = 0x00000000;
        const uint WS_POPUP = 0x80000000;
        const uint WS_CHILD = 0x40000000;
        const uint WS_MINIMIZE = 0x20000000;
        const uint WS_VISIBLE = 0x10000000;
        const uint WS_DISABLED = 0x08000000;
        const uint WS_CLIPSIBLINGS = 0x04000000;
        const uint WS_CLIPCHILDREN = 0x02000000;
        const uint WS_MAXIMIZE = 0x01000000;
        const uint WS_CAPTION = 0x00C00000; // WS_BORDER | WS_DLGFRAME
        const uint WS_BORDER = 0x00800000;
        const uint WS_DLGFRAME = 0x00400000;
        const uint WS_VSCROLL = 0x00200000;
        const uint WS_HSCROLL = 0x00100000;
        const uint WS_SYSMENU = 0x00080000;
        const uint WS_THICKFRAME = 0x00040000;
        const uint WS_GROUP = 0x00020000;
        const uint WS_TABSTOP = 0x00010000;
     
        const uint WS_MINIMIZEBOX = 0x00020000;
        const uint WS_MAXIMIZEBOX = 0x00010000;
     
        const uint WS_TILED = WS_OVERLAPPED;
        const uint WS_ICONIC = WS_MINIMIZE;
        const uint WS_SIZEBOX = WS_THICKFRAME;
        const uint WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW;
     
        const uint WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
        const uint WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU;
        const uint WS_CHILDWINDOW = WS_CHILD;
     
        const uint WM_CREATE = 0x0001;
        const uint WM_DESTROY = 0x0002;
        const uint WM_PAINT = 0x000F;
        const uint WM_CLOSE = 0x0010;
        const uint WM_COMMAND = 0x0111;
     
        const uint COLOR_WINDOW = 5;
        const uint COLOR_BTNFACE = 15;
     
        const uint CS_VREDRAW = 0x0001;
        const uint CS_HREDRAW = 0x0002;
     
        const int CW_USEDEFAULT = -2147483648; // ((uint)0x80000000)
     
        const uint SW_SHOWDEFAULT = 10;
     
        const int IDI_APPLICATION = 32512;
        const int IDC_ARROW = 32512;
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr LoadCursor(IntPtr hInstance, IntPtr lpCursorName);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr LoadIcon(IntPtr hInstance, IntPtr lpIconName);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern short RegisterClassEx(ref WNDCLASSEX pcWndClassEx);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr CreateWindowEx(uint dwExStyle, string lpClassName, string lpWindowName, uint dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern bool UpdateWindow(IntPtr hWnd);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern int GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern int TranslateMessage([In] ref MSG lpMsg);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr DispatchMessage([In] ref MSG lpMsg);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern void PostQuitMessage(int nExitCode);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr BeginPaint(IntPtr hWnd, out PAINTSTRUCT lpPaint);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr EndPaint(IntPtr hWnd, ref PAINTSTRUCT lpPaint);
     
        [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr TextOut( IntPtr hdc, int x, int y, string lpString, int nCount );
     
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr GetModuleHandle(string lpModuleName);
     
        static IntPtr WndProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
        {
            PAINTSTRUCT ps = new PAINTSTRUCT();
            IntPtr hdc;
            string strMessage = "Hello, Win32 GUI(MSIL) World!";
     
            switch (uMsg)
            {
                case WM_PAINT:
                    hdc = BeginPaint( hWnd, out ps );
                    TextOut( hdc, 0, 0, strMessage, strMessage.Length );
                    EndPaint( hWnd, ref ps );
                    break;
                case WM_DESTROY:
                    PostQuitMessage(0);
                    break;
                default:
                    return DefWindowProc(hWnd, uMsg, wParam, lParam);
            }
     
            return IntPtr.Zero;
        }
     
        static int WinMain(string[] args)
        {
            IntPtr hInstance = Marshal.GetHINSTANCE(typeof(Hello).Module);
            const string CLASS_NAME = "helloWindow";
            const string WINDOW_NAME = "Hello, World!";
     
            WNDCLASSEX wcex = new WNDCLASSEX();
            wcex.cbSize = (uint)Marshal.SizeOf(wcex);
            wcex.style = CS_HREDRAW | CS_VREDRAW;
            wcex.lpfnWndProc = new WndProcDelgate(WndProc);
            wcex.cbClsExtra = 0;
            wcex.cbWndExtra = 0;
            wcex.hInstance = hInstance;
            wcex.hIcon = LoadIcon(hInstance, new IntPtr(IDI_APPLICATION));
            wcex.hCursor = LoadIcon(hInstance, new IntPtr(IDC_ARROW));
            wcex.hbrBackground = new IntPtr(COLOR_WINDOW + 1);
            wcex.lpszMenuName = "";
            wcex.lpszClassName = CLASS_NAME;
            wcex.hIconSm = IntPtr.Zero;
     
            RegisterClassEx(ref wcex);
     
            IntPtr hWnd = CreateWindowEx(
                0,
                wcex.lpszClassName,
                WINDOW_NAME,
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                640,
                480,
                IntPtr.Zero,
                IntPtr.Zero,
                wcex.hInstance,
                IntPtr.Zero);
     
            ShowWindow(hWnd, SW_SHOWDEFAULT);
            UpdateWindow(hWnd);
     
            MSG msg = new MSG();
            while (GetMessage(out msg, IntPtr.Zero, 0, 0) != 0)
            {
                TranslateMessage(ref msg);
                DispatchMessage(ref msg);
            }
     
            return (int)msg.wParam;
        }
     
        [STAThread]
        static int Main(string[] args)
        {
            return WinMain( args );
        }
    }

    コンパイル方法

    C:¥> ilasm Hello.il

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(MSIL) World!             |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  4. Hello, Win32 GUI(VB.NET) World!

    Posted on 7月 10th, 2012 by cx20

    Win32 GUI(VB.NET)

    Win32 アプリケーションは Windows 標準 API である Win32 API を使用した Windows アプリケーションである。
    以下は VB.NET において Win32 API を使用した GUI アプリケーション の例となっている。

    ソースコード

    Imports System.Runtime.InteropServices
     
    Public Class HelloWindow
        Const WS_CAPTION As Integer = &HC00000
        Const WS_MAXIMIZEBOX As Integer = &H10000
        Const WS_MINIMIZEBOX As Integer = &H20000
        Const WS_OVERLAPPED As Integer = &H0
        Const WS_SYSMENU As Integer = &H80000
        Const WS_THICKFRAME As Integer = &H40000
        Const WS_OVERLAPPEDWINDOW As Integer = ( _
            WS_OVERLAPPED Or _
            WS_CAPTION Or _
            WS_SYSMENU Or _
            WS_THICKFRAME Or _
            WS_MINIMIZEBOX Or _
            WS_MAXIMIZEBOX)
     
        Const COLOR_WINDOW As Integer = 5
        Const COLOR_BTNFACE As Integer = 15
     
        Const CS_VREDRAW As Integer = &H1
        Const CS_HREDRAW As Integer = &H2
        Const CW_USEDEFAULT As Integer = &H80000000
     
        Const IDI_APPLICATION As Integer = 32512
        Const IDC_ARROW As Integer = 32512
     
        Const LTGRAY_BRUSH As Integer = 1
     
        Const SW_SHOWNORMAL As Integer = 1
        Const SW_SHOWDEFAULT As Integer = 10
     
        Const WM_DESTROY As Integer = &H2
        Const WM_PAINT As Integer = &HF
     
        Delegate Function WndProcDelgate( _
            ByVal hWnd As IntPtr, _
            ByVal Message As Integer, _
            ByVal wParam As IntPtr, _
            ByVal lParam As IntPtr _
        ) As IntPtr
     
        <StructLayout(LayoutKind.Sequential)> _
        Structure POINTAPI
            Public x As Integer
            Public y As Integer
        End Structure
     
        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
        Structure MSG
            Public hWnd As IntPtr
            Public Message As Integer
            Public wParam As IntPtr
            Public lParam As IntPtr
            Public time As Integer
            Public pt As POINTAPI
        End Structure
     
        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
        Structure WNDCLASSEX
            Public cbSize As Integer
            Public style As Integer
            Public lpfnWndProc As WndProcDelgate
            Public cbClsExtra As Integer
            Public cbWndExtra As Integer
            Public hInstance As IntPtr
            Public hIcon As IntPtr
            Public hCursor As IntPtr
            Public hbrBackground As IntPtr
            Public lpszMenuName As String
            Public lpszClassName As String
            Public hIconSm As IntPtr
        End Structure
     
        <StructLayout(LayoutKind.Sequential)> _
        Structure RECT
            Public Left As Integer
            Public Top As Integer
            Public Right As Integer
            Public Bottom As Integer
        End Structure
     
        <StructLayout(LayoutKind.Sequential)> _
        Structure PAINTSTRUCT
            Public hdc As IntPtr
            Public fErase As Integer
            Public rcPaint As RECT
            Public fRestore As Integer
            Public fIncUpdate As Integer
            <MarshalAs(UnmanagedType.ByValArray, SizeConst := 32)> _
            Public rgbReserved As Byte()
        End Structure
     
        Declare Auto Function LoadCursor Lib "user32" ( _
            ByVal hInstance As IntPtr, _
            ByVal lpCursorName As IntPtr _
        ) As IntPtr
     
        Declare Auto Function LoadIcon Lib "user32" ( _
            ByVal hInstance As IntPtr, _
            ByVal lpIconName As IntPtr _
        ) As IntPtr
     
        Declare Auto Function RegisterClassEx Lib "user32" ( _
            ByRef pcWndClassEx As WNDCLASSEX _
        ) As Integer
     
        Declare Auto Function CreateWindowEx Lib "user32" ( _
            ByVal dwExStyle As Integer, _
            ByVal lpClassName As String, _
            ByVal lpWindowName As String, _
            ByVal dwStyle As Integer, _
            ByVal x As Integer, _
            ByVal y As Integer, _
            ByVal nWidth As Integer, _
            ByVal nHeight As Integer, _
            ByVal hWndParent As IntPtr, _
            ByVal hMenu As IntPtr, _
            ByVal hInstance As IntPtr, _
            ByVal lpParam As IntPtr _
        ) As IntPtr
     
        Declare Function ShowWindow Lib "user32" ( _
            ByVal hWnd As IntPtr, _
            ByVal nCmdShow As Integer _
        ) As Boolean
     
        Declare Function UpdateWindow Lib "user32" (ByVal hWnd As IntPtr) As Boolean
     
        Declare Auto Function GetMessage Lib "user32" ( _
            ByRef lpMsg As MSG, _
            ByVal hWnd As IntPtr, _
            ByVal wMsgFilterMin As Integer, _
            ByVal wMsgFilterMax As Integer _
         ) As Boolean
     
        Declare Function TranslateMessage Lib "user32" ( _
            ByRef lpMsg As MSG _
        ) As Boolean
     
        Declare Auto Function DispatchMessage Lib "user32" ( _
            ByRef lpMsg As MSG _
        ) As IntPtr
     
        Declare Sub PostQuitMessage Lib "user32" ( _
            ByVal nExitCode As Integer _
        )
     
        Declare Function BeginPaint Lib "user32" ( _
            ByVal hwnd As IntPtr, _
            ByRef lpPaint As PAINTSTRUCT _
        ) As IntPtr
     
        Declare Function EndPaint Lib "user32" ( _
            ByVal hwnd As IntPtr, _
            ByRef lpPaint As PAINTSTRUCT _
        ) As IntPtr
     
        Declare Auto Function TextOut Lib "gdi32" ( _
            ByVal hdc As IntPtr, _
            ByVal x As Integer, _
            ByVal y As Integer, _
            ByVal lpString As String, _
            ByVal nCount As Integer _
        ) As Integer
     
        Declare Function GetStockObject Lib "gdi32" ( _
            ByVal nIndex As Integer _
        ) As IntPtr
     
        Declare Auto Function DefWindowProc Lib "user32" ( _
            ByVal hWnd As IntPtr, _
            ByVal wMsg As Integer, _
            ByVal wParam As IntPtr, _
            ByVal lParam As IntPtr _
        ) As IntPtr
     
        Function WndProc( _
            ByVal hWnd As IntPtr, _
            ByVal msg As Integer, _
            ByVal wParam As IntPtr, _
            ByVal lParam As IntPtr _
        ) As IntPtr
     
            Dim ps As New PAINTSTRUCT
            Dim hdc As IntPtr
            Dim strMessage As String
            strMessage = "Hello, Win32 GUI(VB.NET) World!"
     
            Select Case msg
                Case WM_PAINT
                    hdc = BeginPaint(hwnd, ps)
                    TextOut( hdc, 0, 0, strMessage, Len(strMessage) )
                    EndPaint( hwnd, ps )
                Case WM_DESTROY
                    PostQuitMessage(0)
                Case Else
                    Return DefWindowProc(hWnd, msg, wParam, lParam)
            End Select
     
            Return IntPtr.Zero
        End Function
     
        Public Function WinMain() As Integer
            Const CLASS_NAME As String = "helloWindow"
            Const WINDOW_NAME As String = "Hello, World!"
     
            Dim hInstance As IntPtr = Marshal.GetHINSTANCE(GetType(HelloWindow).Module)
            Dim hWnd As IntPtr
            Dim msg As MSG
     
            Dim wcex As New WNDCLASSEX
            With wcex
                .cbSize = Marshal.SizeOf(wcex)
                .style = CS_HREDRAW Or CS_VREDRAW
                .lpfnWndProc = New WndProcDelgate(AddressOf WndProc)
                .cbClsExtra = 0
                .cbWndExtra = 0
                .hInstance = hInstance
                .hIcon = LoadIcon(hInstance, New IntPtr(IDI_APPLICATION))
                .hCursor = LoadCursor(hInstance, New IntPtr(IDC_ARROW))
                .hbrBackground = New IntPtr(COLOR_WINDOW + 1)
                .lpszMenuName = Nothing
                .lpszClassName = CLASS_NAME
                .hIconSm = LoadIcon(hInstance, New IntPtr(IDI_APPLICATION))
            End With
     
            RegisterClassEx(wcex)
     
            hWnd = CreateWindowEx( _
                0, _
                CLASS_NAME, _
                WINDOW_NAME, _
                WS_OVERLAPPEDWINDOW, _
                CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, _
                IntPtr.Zero, IntPtr.Zero, hInstance, IntPtr.Zero)
     
            ShowWindow(hWnd, SW_SHOWDEFAULT)
            UpdateWindow(hWnd)
     
            Do While GetMessage(msg, IntPtr.Zero, 0, 0)
                TranslateMessage(msg)
                DispatchMessage(msg)
            Loop
     
            Return CType(msg.wParam, Integer)
        End Function
     
        Public Shared Sub Main()
            Dim hello As New HelloWindow
            hello.WinMain()
        End Sub
    End Class

    コンパイル方法

    C:¥> vbc /target:winexe Hello.vb

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(VB.NET) World!           |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  5. Hello, Win32 GUI(C#) World!

    Posted on 7月 9th, 2012 by cx20

    Win32 GUI(C#)

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

    ソースコード

    using System;
    using System.Runtime.InteropServices;
     
    class Hello
    {
        [StructLayout(LayoutKind.Sequential)]
        struct POINT
        {
            public int x;
            public int y;
        }
     
        [StructLayout(LayoutKind.Sequential)]
        struct MSG
        {
            public IntPtr hwnd;
            public uint message;
            public IntPtr wParam;
            public IntPtr lParam;
            public uint time;
            public POINT pt;
        }
     
        delegate IntPtr WndProcDelgate(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct WNDCLASSEX
        {
            public uint cbSize;
            public uint style;
            public WndProcDelgate lpfnWndProc;
            public Int32 cbClsExtra;
            public Int32 cbWndExtra;
            public IntPtr hInstance;
            public IntPtr hIcon;
            public IntPtr hCursor;
            public IntPtr hbrBackground;
            public string lpszMenuName;
            public string lpszClassName;
            public IntPtr hIconSm;
        }
     
        [StructLayout(LayoutKind.Sequential)]
        struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
     
        [StructLayout(LayoutKind.Sequential)]
        struct PAINTSTRUCT
        {
            public IntPtr hdc;
            public int fErase;
            public RECT rcPaint;
            public int fRestore;
            public int fIncUpdate;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public byte[] rgbReserved;
        }
     
        const uint WS_OVERLAPPED = 0x00000000;
        const uint WS_POPUP = 0x80000000;
        const uint WS_CHILD = 0x40000000;
        const uint WS_MINIMIZE = 0x20000000;
        const uint WS_VISIBLE = 0x10000000;
        const uint WS_DISABLED = 0x08000000;
        const uint WS_CLIPSIBLINGS = 0x04000000;
        const uint WS_CLIPCHILDREN = 0x02000000;
        const uint WS_MAXIMIZE = 0x01000000;
        const uint WS_CAPTION = 0x00C00000; // WS_BORDER | WS_DLGFRAME
        const uint WS_BORDER = 0x00800000;
        const uint WS_DLGFRAME = 0x00400000;
        const uint WS_VSCROLL = 0x00200000;
        const uint WS_HSCROLL = 0x00100000;
        const uint WS_SYSMENU = 0x00080000;
        const uint WS_THICKFRAME = 0x00040000;
        const uint WS_GROUP = 0x00020000;
        const uint WS_TABSTOP = 0x00010000;
     
        const uint WS_MINIMIZEBOX = 0x00020000;
        const uint WS_MAXIMIZEBOX = 0x00010000;
     
        const uint WS_TILED = WS_OVERLAPPED;
        const uint WS_ICONIC = WS_MINIMIZE;
        const uint WS_SIZEBOX = WS_THICKFRAME;
        const uint WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW;
     
        const uint WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
        const uint WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU;
        const uint WS_CHILDWINDOW = WS_CHILD;
     
        const uint WM_CREATE = 0x0001;
        const uint WM_DESTROY = 0x0002;
        const uint WM_PAINT = 0x000F;
        const uint WM_CLOSE = 0x0010;
        const uint WM_COMMAND = 0x0111;
     
        const uint COLOR_WINDOW = 5;
        const uint COLOR_BTNFACE = 15;
     
        const uint CS_VREDRAW = 0x0001;
        const uint CS_HREDRAW = 0x0002;
     
        const int CW_USEDEFAULT = -2147483648; // ((uint)0x80000000)
     
        const uint SW_SHOWDEFAULT = 10;
     
        const int IDI_APPLICATION = 32512;
        const int IDC_ARROW = 32512;
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr LoadCursor(IntPtr hInstance, IntPtr lpCursorName);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr LoadIcon(IntPtr hInstance, IntPtr lpIconName);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern short RegisterClassEx(ref WNDCLASSEX pcWndClassEx);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr CreateWindowEx(uint dwExStyle, string lpClassName, string lpWindowName, uint dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern bool UpdateWindow(IntPtr hWnd);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern int GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern int TranslateMessage([In] ref MSG lpMsg);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr DispatchMessage([In] ref MSG lpMsg);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern void PostQuitMessage(int nExitCode);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr BeginPaint(IntPtr hWnd, out PAINTSTRUCT lpPaint);
     
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr EndPaint(IntPtr hWnd, ref PAINTSTRUCT lpPaint);
     
        [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr TextOut( IntPtr hdc, int x, int y, string lpString, int nCount );
     
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr GetModuleHandle(string lpModuleName);
     
        static IntPtr WndProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
        {
            PAINTSTRUCT ps = new PAINTSTRUCT();
            IntPtr hdc;
            string strMessage = "Hello, Win32 GUI(C#) World!";
     
            switch (uMsg)
            {
                case WM_PAINT:
                    hdc = BeginPaint( hWnd, out ps );
                    TextOut( hdc, 0, 0, strMessage, strMessage.Length );
                    EndPaint( hWnd, ref ps );
                    break;
                case WM_DESTROY:
                    PostQuitMessage(0);
                    break;
                default:
                    return DefWindowProc(hWnd, uMsg, wParam, lParam);
            }
     
            return IntPtr.Zero;
        }
     
        static int WinMain(string[] args)
        {
            IntPtr hInstance = Marshal.GetHINSTANCE(typeof(Hello).Module);
            const string CLASS_NAME = "helloWindow";
            const string WINDOW_NAME = "Hello, World!";
     
            WNDCLASSEX wcex = new WNDCLASSEX();
            wcex.cbSize = (uint)Marshal.SizeOf(wcex);
            wcex.style = CS_HREDRAW | CS_VREDRAW;
            wcex.lpfnWndProc = new WndProcDelgate(WndProc);
            wcex.cbClsExtra = 0;
            wcex.cbWndExtra = 0;
            wcex.hInstance = hInstance;
            wcex.hIcon = LoadIcon(hInstance, new IntPtr(IDI_APPLICATION));
            wcex.hCursor = LoadIcon(hInstance, new IntPtr(IDC_ARROW));
            wcex.hbrBackground = new IntPtr(COLOR_WINDOW + 1);
            wcex.lpszMenuName = "";
            wcex.lpszClassName = CLASS_NAME;
            wcex.hIconSm = IntPtr.Zero;
     
            RegisterClassEx(ref wcex);
     
            IntPtr hWnd = CreateWindowEx(
                0,
                wcex.lpszClassName,
                WINDOW_NAME,
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                640,
                480,
                IntPtr.Zero,
                IntPtr.Zero,
                wcex.hInstance,
                IntPtr.Zero);
     
            ShowWindow(hWnd, SW_SHOWDEFAULT);
            UpdateWindow(hWnd);
     
            MSG msg = new MSG();
            while (GetMessage(out msg, IntPtr.Zero, 0, 0) != 0)
            {
                TranslateMessage(ref msg);
                DispatchMessage(ref msg);
            }
     
            return (int)msg.wParam;
        }
     
        [STAThread]
        static int Main(string[] args)
        {
            return WinMain( args );
        }
    }

    コンパイル方法

    C:¥> csc /target:winexe Hello.cs

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(C#) World!               |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  6. Hello, Win32 GUI(VBA) World!

    Posted on 7月 8th, 2012 by cx20

    Win32 GUI(VBA)

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

    ソースコード

    Private Const WS_OVERLAPPED As Long = &H0
    Private Const WS_MAXIMIZEBOX As Long = &H10000
    Private Const WS_MINIMIZEBOX As Long = &H20000
    Private Const WS_THICKFRAME As Long = &H40000
    Private Const WS_SYSMENU As Long = &H80000
    Private Const WS_CAPTION As Long = &HC00000
    Private Const WS_EX_APPWINDOW As Long = &H40000
    Private Const WS_OVERLAPPEDWINDOW As Long = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
     
    Private Const CS_VREDRAW As Long = &H1
    Private Const CS_HREDRAW As Long = &H2
     
    Private Const IDI_APPLICATION As Long = 32512
    Private Const IDC_ARROW As Long = 32512
     
    Private Const COLOR_WINDOW As Long = 5
    Private Const COLOR_BTNFACE As Long = 15
     
    Private Const WHITE_BRUSH As Long = 0
     
    Private Const CW_USEDEFAULT As Long = &H80000000
     
    Private Const SW_SHOWNORMAL As Long = 1
    Private Const SW_SHOW As Long = 5
    Private Const SW_SHOWDEFAULT As Long = 10
     
    Private Const WM_DESTROY As Long = &H2
    Private Const WM_PAINT As Long = &HF
     
    Private Const CLASS_NAME As String = "helloWindow"
    Private Const WINDOW_NAME As String = "Hello, World!"
     
    Private Type POINTAPI
        x As Long
        y As Long
    End Type
     
    Private Type MSG
        hwnd As Long
        message As Long
        wParam As Long
        lParam As Long
        time As Long
        pt As POINTAPI
    End Type
     
    Private Type WNDCLASSEX
        cbSize As Long
        style As Long
        lpfnWndProc As Long
        cbClsExtra As Long
        cbWndExtra As Long
        hInstance As Long
        hIcon As Long
        hCursor As Long
        hbrBackground As Long
        lpszMenuName As String
        lpszClassName As String
        hIconSm As Long
    End Type
     
    Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
    End Type
     
    Type PAINTSTRUCT
        hdc As Long
        fErase As Long
        rcPaint As RECT
        fRestore As Long
        fIncUpdate As Long
        rgbReserved As Byte
    End Type
     
    Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As Long) As Long
    Private Declare Function LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As Long) As Long
    Private Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long
    Private Declare Function GetStockObject Lib "gdi32" (ByVal fnObject As Long) As Long
    Private Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" (lpwcx As WNDCLASSEX) As Long
    Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Private Declare Function UpdateWindow Lib "user32" (ByVal lhwnd As Long) As Long
    Private Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
    Private Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
    Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long
    Private Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)
    Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function BeginPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long
    Private Declare Function EndPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long
    Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
     
    Private Function FuncPtr(ByVal p As Long) As Long
        FuncPtr = p
    End Function
     
    Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Dim ps As PAINTSTRUCT
        Dim hdc As Long
        Dim strMessage As String
        strMessage = "Hello, Win32 GUI(VBA) World!"
     
        Select Case uMsg
        Case WM_PAINT
            hdc = BeginPaint(hwnd, ps)
            TextOut hdc, 0, 0, strMessage, Len(strMessage)
            EndPaint hwnd, ps
        Case WM_DESTROY
            Call PostQuitMessage(0)
        Case Else
            WindowProc = DefWindowProc(hwnd, uMsg, wParam, lParam)
            Exit Function
        End Select
        WindowProc = 0
    End Function
     
    Public Function WinMain() As Integer
        Dim wcex As WNDCLASSEX
        Dim hwnd As Long
        Dim message As MSG
        Dim pfnc As Long
        wcex.cbSize = Len(wcex)
        wcex.style = CS_HREDRAW Or CS_VREDRAW
        wcex.lpfnWndProc = FuncPtr(AddressOf WindowProc)
        wcex.cbClsExtra = 0
        wcex.cbWndExtra = 0
        wcex.hInstance = GetModuleHandle(0)
        wcex.hIcon = LoadIcon(0, IDI_APPLICATION)
        wcex.hCursor = LoadCursor(0, IDC_ARROW)
        wcex.hbrBackground = COLOR_WINDOW + 1
        wcex.lpszMenuName = vbNullString
        wcex.lpszClassName = CLASS_NAME
        wcex.hIconSm = LoadIcon(0, IDI_APPLICATION)
     
        Call RegisterClassEx(wcex)
     
        hwnd = CreateWindowEx( _
            0, _
            CLASS_NAME, _
            WINDOW_NAME, _
            WS_OVERLAPPEDWINDOW, _
            CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, _
            0, 0, wcex.hInstance, 0)
     
        Call ShowWindow(hwnd, SW_SHOWDEFAULT)
        Call UpdateWindow(hwnd)
     
        Do While (GetMessage(message, 0, 0, 0))
            Call TranslateMessage(message)
            Call DispatchMessage(message)
        Loop
     
        WinMain = message.wParam
    End Function
     
    Public Sub Main()
        Call WinMain
    End Sub

    なお、Office 2010 では AddressOf 演算子が使えなくなっている為、動作確認をすることができなかった。

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(VBA) World!              |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  7. Hello, Win32 GUI(VB6) World!

    Posted on 7月 7th, 2012 by cx20

    Win32 GUI(VB6)

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

    ソースコード

    Private Const WS_OVERLAPPED As Long = &H0
    Private Const WS_MAXIMIZEBOX As Long = &H10000
    Private Const WS_MINIMIZEBOX As Long = &H20000
    Private Const WS_THICKFRAME As Long = &H40000
    Private Const WS_SYSMENU As Long = &H80000
    Private Const WS_CAPTION As Long = &HC00000
    Private Const WS_EX_APPWINDOW As Long = &H40000
    Private Const WS_OVERLAPPEDWINDOW As Long = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
     
    Private Const CS_VREDRAW As Long = &H1
    Private Const CS_HREDRAW As Long = &H2
     
    Private Const IDI_APPLICATION As Long = 32512
    Private Const IDC_ARROW As Long = 32512
     
    Private Const COLOR_WINDOW As Long = 5
    Private Const COLOR_BTNFACE As Long = 15
     
    Private Const WHITE_BRUSH As Long = 0
     
    Private Const CW_USEDEFAULT As Long = &H80000000
     
    Private Const SW_SHOWNORMAL As Long = 1
    Private Const SW_SHOW As Long = 5
    Private Const SW_SHOWDEFAULT As Long = 10
     
    Private Const WM_DESTROY As Long = &H2
    Private Const WM_PAINT As Long = &HF
     
    Private Const CLASS_NAME As String = "helloWindow"
    Private Const WINDOW_NAME As String = "Hello, World!"
     
    Private Type POINTAPI
        x As Long
        y As Long
    End Type
     
    Private Type MSG
        hwnd As Long
        message As Long
        wParam As Long
        lParam As Long
        time As Long
        pt As POINTAPI
    End Type
     
    Private Type WNDCLASSEX
        cbSize As Long
        style As Long
        lpfnWndProc As Long
        cbClsExtra As Long
        cbWndExtra As Long
        hInstance As Long
        hIcon As Long
        hCursor As Long
        hbrBackground As Long
        lpszMenuName As String
        lpszClassName As String
        hIconSm As Long
    End Type
     
    Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
    End Type
     
    Type PAINTSTRUCT
        hdc As Long
        fErase As Long
        rcPaint As RECT
        fRestore As Long
        fIncUpdate As Long
        rgbReserved As Byte
    End Type
     
    Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As Long) As Long
    Private Declare Function LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As Long) As Long
    Private Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long
    Private Declare Function GetStockObject Lib "gdi32" (ByVal fnObject As Long) As Long
    Private Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" (lpwcx As WNDCLASSEX) As Long
    Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Private Declare Function UpdateWindow Lib "user32" (ByVal lhwnd As Long) As Long
    Private Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
    Private Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
    Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long
    Private Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)
    Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function BeginPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long
    Private Declare Function EndPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long
    Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
     
    Private Function FuncPtr(ByVal p As Long) As Long
        FuncPtr = p
    End Function
     
    Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Dim ps As PAINTSTRUCT
        Dim hdc As Long
        Dim strMessage As String
        strMessage = "Hello, Win32 GUI(VB6) World!"
     
        Select Case uMsg
        Case WM_PAINT
            hdc = BeginPaint(hwnd, ps)
            TextOut hdc, 0, 0, strMessage, Len(strMessage)
            EndPaint hwnd, ps
        Case WM_DESTROY
            Call PostQuitMessage(0)
        Case Else
            WindowProc = DefWindowProc(hwnd, uMsg, wParam, lParam)
            Exit Function
        End Select
        WindowProc = 0
    End Function
     
    Public Function WinMain() As Integer
        Dim wcex As WNDCLASSEX
        Dim hwnd As Long
        Dim message As MSG
        Dim pfnc As Long
        wcex.cbSize = Len(wcex)
        wcex.style = CS_HREDRAW Or CS_VREDRAW
        wcex.lpfnWndProc = FuncPtr(AddressOf WindowProc)
        wcex.cbClsExtra = 0
        wcex.cbWndExtra = 0
        wcex.hInstance = GetModuleHandle(0)
        wcex.hIcon = LoadIcon(0, IDI_APPLICATION)
        wcex.hCursor = LoadCursor(0, IDC_ARROW)
        wcex.hbrBackground = COLOR_WINDOW + 1
        wcex.lpszMenuName = vbNullString
        wcex.lpszClassName = CLASS_NAME
        wcex.hIconSm = LoadIcon(0, IDI_APPLICATION)
     
        Call RegisterClassEx(wcex)
     
        hwnd = CreateWindowEx( _
            0, _
            CLASS_NAME, _
            WINDOW_NAME, _
            WS_OVERLAPPEDWINDOW, _
            CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, _
            0, 0, wcex.hInstance, 0)
     
        Call ShowWindow(hwnd, SW_SHOWDEFAULT)
        Call UpdateWindow(hwnd)
     
        Do While (GetMessage(message, 0, 0, 0))
            Call TranslateMessage(message)
            Call DispatchMessage(message)
        Loop
     
        WinMain = message.wParam
    End Function
     
    Public Sub Main()
        Call WinMain
    End Sub

    コンパイル方法

    C:¥> vb6 /make hello.vbp

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(VB6) World!              |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  8. Hello, Win32 GUI(MASM) World!

    Posted on 7月 6th, 2012 by cx20

    Win32 GUI(MASM)

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

    ソースコード

    ; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.40219.01 
     
            TITLE   hello.c
            .686P
            .XMM
            include listing.inc
            .model  flat
     
    INCLUDELIB LIBCMT
    INCLUDELIB OLDNAMES
     
    _DATA   SEGMENT
    $SG79977 DB     'Hello, Win32 GUI(MASM) World!', 00H
            ORG $+2
    $SG79995 DB     'helloWindow', 00H
    $SG79997 DB     'Hello, World!', 00H
    _DATA   ENDS
    PUBLIC  __$ArrayPad$
    PUBLIC  _WndProc@16
    EXTRN   __imp__DefWindowProcA@16:PROC
    EXTRN   __imp__PostQuitMessage@4:PROC
    EXTRN   __imp__EndPaint@8:PROC
    EXTRN   __imp__TextOutA@20:PROC
    EXTRN   __imp__lstrlenA@4:PROC
    EXTRN   __imp__BeginPaint@8:PROC
    EXTRN   ___security_cookie:DWORD
    EXTRN   @__security_check_cookie@4:PROC
    ; Function compile flags: /Odtp
    _TEXT   SEGMENT
    tv64 = -84                                              ; size = 4
    _hdc$ = -80                                             ; size = 4
    _lpszMessage$ = -76                                     ; size = 4
    _ps$ = -72                                              ; size = 64
    __$ArrayPad$ = -4                                       ; size = 4
    _hWnd$ = 8                                              ; size = 4
    _message$ = 12                                          ; size = 4
    _wParam$ = 16                                           ; size = 4
    _lParam$ = 20                                           ; size = 4
    _WndProc@16 PROC
    ; File hello.c
    ; Line 5
            push    ebp
            mov     ebp, esp
            sub     esp, 84                                 ; 00000054H
            mov     eax, DWORD PTR ___security_cookie
            xor     eax, ebp
            mov     DWORD PTR __$ArrayPad$[ebp], eax
    ; Line 8
            mov     DWORD PTR _lpszMessage$[ebp], OFFSET $SG79977
    ; Line 10
            mov     eax, DWORD PTR _message$[ebp]
            mov     DWORD PTR tv64[ebp], eax
            cmp     DWORD PTR tv64[ebp], 2
            je      SHORT $LN2@WndProc
            cmp     DWORD PTR tv64[ebp], 15                 ; 0000000fH
            je      SHORT $LN3@WndProc
            jmp     SHORT $LN1@WndProc
    $LN3@WndProc:
    ; Line 13
            lea     ecx, DWORD PTR _ps$[ebp]
            push    ecx
            mov     edx, DWORD PTR _hWnd$[ebp]
            push    edx
            call    DWORD PTR __imp__BeginPaint@8
            mov     DWORD PTR _hdc$[ebp], eax
    ; Line 14
            mov     eax, DWORD PTR _lpszMessage$[ebp]
            push    eax
            call    DWORD PTR __imp__lstrlenA@4
            push    eax
            mov     ecx, DWORD PTR _lpszMessage$[ebp]
            push    ecx
            push    0
            push    0
            mov     edx, DWORD PTR _hdc$[ebp]
            push    edx
            call    DWORD PTR __imp__TextOutA@20
    ; Line 15
            lea     eax, DWORD PTR _ps$[ebp]
            push    eax
            mov     ecx, DWORD PTR _hWnd$[ebp]
            push    ecx
            call    DWORD PTR __imp__EndPaint@8
    ; Line 16
            jmp     SHORT $LN4@WndProc
    $LN2@WndProc:
    ; Line 18
            push    0
            call    DWORD PTR __imp__PostQuitMessage@4
    ; Line 19
            jmp     SHORT $LN4@WndProc
    $LN1@WndProc:
    ; Line 21
            mov     edx, DWORD PTR _lParam$[ebp]
            push    edx
            mov     eax, DWORD PTR _wParam$[ebp]
            push    eax
            mov     ecx, DWORD PTR _message$[ebp]
            push    ecx
            mov     edx, DWORD PTR _hWnd$[ebp]
            push    edx
            call    DWORD PTR __imp__DefWindowProcA@16
            jmp     SHORT $LN6@WndProc
    $LN4@WndProc:
    ; Line 25
            xor     eax, eax
    $LN6@WndProc:
    ; Line 26
            mov     ecx, DWORD PTR __$ArrayPad$[ebp]
            xor     ecx, ebp
            call    @__security_check_cookie@4
            mov     esp, ebp
            pop     ebp
            ret     16                                      ; 00000010H
    _WndProc@16 ENDP
    _TEXT   ENDS
    PUBLIC  _WinMain@16
    EXTRN   __imp__DispatchMessageA@4:PROC
    EXTRN   __imp__TranslateMessage@4:PROC
    EXTRN   __imp__GetMessageA@16:PROC
    EXTRN   __imp__UpdateWindow@4:PROC
    EXTRN   __imp__ShowWindow@8:PROC
    EXTRN   __imp__CreateWindowExA@48:PROC
    EXTRN   __imp__RegisterClassExA@4:PROC
    EXTRN   __imp__LoadCursorA@8:PROC
    EXTRN   __imp__LoadIconA@8:PROC
    ; Function compile flags: /Odtp
    _TEXT   SEGMENT
    _lpszClassName$ = -88                                   ; size = 4
    _msg$ = -84                                             ; size = 28
    _wcex$ = -56                                            ; size = 48
    _hWnd$ = -8                                             ; size = 4
    _lpszWindowName$ = -4                                   ; size = 4
    _hInstance$ = 8                                         ; size = 4
    _hPrevInstance$ = 12                                    ; size = 4
    _lpCmdLine$ = 16                                        ; size = 4
    _nCmdShow$ = 20                                         ; size = 4
    _WinMain@16 PROC
    ; Line 29
            push    ebp
            mov     ebp, esp
            sub     esp, 88                                 ; 00000058H
    ; Line 30
            mov     DWORD PTR _lpszClassName$[ebp], OFFSET $SG79995
    ; Line 31
            mov     DWORD PTR _lpszWindowName$[ebp], OFFSET $SG79997
    ; Line 36
            mov     DWORD PTR _wcex$[ebp], 48               ; 00000030H
    ; Line 37
            mov     DWORD PTR _wcex$[ebp+4], 3
    ; Line 38
            mov     DWORD PTR _wcex$[ebp+8], OFFSET _WndProc@16
    ; Line 39
            mov     DWORD PTR _wcex$[ebp+12], 0
    ; Line 40
            mov     DWORD PTR _wcex$[ebp+16], 0
    ; Line 41
            mov     eax, DWORD PTR _hInstance$[ebp]
            mov     DWORD PTR _wcex$[ebp+20], eax
    ; Line 42
            push    32512                                   ; 00007f00H
            mov     ecx, DWORD PTR _hInstance$[ebp]
            push    ecx
            call    DWORD PTR __imp__LoadIconA@8
            mov     DWORD PTR _wcex$[ebp+24], eax
    ; Line 43
            push    32512                                   ; 00007f00H
            push    0
            call    DWORD PTR __imp__LoadCursorA@8
            mov     DWORD PTR _wcex$[ebp+28], eax
    ; Line 44
            mov     DWORD PTR _wcex$[ebp+32], 6
    ; Line 45
            mov     DWORD PTR _wcex$[ebp+36], 0
    ; Line 46
            mov     edx, DWORD PTR _lpszClassName$[ebp]
            mov     DWORD PTR _wcex$[ebp+40], edx
    ; Line 47
            push    32512                                   ; 00007f00H
            mov     eax, DWORD PTR _wcex$[ebp+20]
            push    eax
            call    DWORD PTR __imp__LoadIconA@8
            mov     DWORD PTR _wcex$[ebp+44], eax
    ; Line 49
            lea     ecx, DWORD PTR _wcex$[ebp]
            push    ecx
            call    DWORD PTR __imp__RegisterClassExA@4
    ; Line 56
            push    0
            mov     edx, DWORD PTR _hInstance$[ebp]
            push    edx
            push    0
            push    0
            push    480                                     ; 000001e0H
            push    640                                     ; 00000280H
            push    -2147483648                             ; 80000000H
            push    -2147483648                             ; 80000000H
            push    13565952                                ; 00cf0000H
            mov     eax, DWORD PTR _lpszWindowName$[ebp]
            push    eax
            mov     ecx, DWORD PTR _lpszClassName$[ebp]
            push    ecx
            push    0
            call    DWORD PTR __imp__CreateWindowExA@48
            mov     DWORD PTR _hWnd$[ebp], eax
    ; Line 58
            push    10                                      ; 0000000aH
            mov     edx, DWORD PTR _hWnd$[ebp]
            push    edx
            call    DWORD PTR __imp__ShowWindow@8
    ; Line 59
            mov     eax, DWORD PTR _hWnd$[ebp]
            push    eax
            call    DWORD PTR __imp__UpdateWindow@4
    $LN2@WinMain:
    ; Line 61
            push    0
            push    0
            push    0
            lea     ecx, DWORD PTR _msg$[ebp]
            push    ecx
            call    DWORD PTR __imp__GetMessageA@16
            test    eax, eax
            je      SHORT $LN1@WinMain
    ; Line 63
            lea     edx, DWORD PTR _msg$[ebp]
            push    edx
            call    DWORD PTR __imp__TranslateMessage@4
    ; Line 64
            lea     eax, DWORD PTR _msg$[ebp]
            push    eax
            call    DWORD PTR __imp__DispatchMessageA@4
    ; Line 65
            jmp     SHORT $LN2@WinMain
    $LN1@WinMain:
    ; Line 67
            mov     eax, DWORD PTR _msg$[ebp+8]
    ; Line 68
            mov     esp, ebp
            pop     ebp
            ret     16                                      ; 00000010H
    _WinMain@16 ENDP
    _TEXT   ENDS
    END

    上記コードは以下のC言語のソースを VC++ でアセンブリコード出力(cl /FA hello.c)したものに相当する。

    #include <windows.h>
    #include <tchar.h>
     
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        PAINTSTRUCT ps;
        HDC hdc;
        LPCTSTR lpszMessage = _T("Hello, Win32 GUI(MASM) World!");
     
        switch (message)
        {
        case WM_PAINT:
            hdc = BeginPaint( hWnd, &ps );
            TextOut( hdc, 0, 0, lpszMessage, lstrlen(lpszMessage) );
            EndPaint( hWnd, &ps );
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
            break;
        }
     
        return 0;
    }
     
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        LPCTSTR lpszClassName = _T("helloWindow");
        LPCTSTR lpszWindowName = _T("Hello, World!");
        WNDCLASSEX wcex;
        HWND hWnd;
        MSG msg;
     
        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = NULL;
        wcex.lpszClassName  = lpszClassName;
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
     
        RegisterClassEx(&wcex);
        hWnd = CreateWindow(
            lpszClassName,
            lpszWindowName,
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
            NULL, NULL, hInstance, NULL
        );
     
        ShowWindow(hWnd, SW_SHOWDEFAULT);
        UpdateWindow(hWnd);
     
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
     
        return (int)msg.wParam;
    }

    コンパイル方法

    C:¥> ml hello.asm /link user32.lib gdi32.lib /SUBSYSTEM:WINDOWS

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(MASM) World!             |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  9. Hello, Win32 GUI(MFC) World!

    Posted on 7月 5th, 2012 by cx20

    Win32 GUI(MFC)

    Win32 アプリケーションは Windows 標準 API である Win32 API を使用した Windows アプリケーションである。
    以下は VC++(MFC) における Win32 GUI アプリケーション の例となっている。

    ソースコード

    #include <afxwin.h>
    #include <tchar.h>
     
    class CMainFrame : public CFrameWnd
    {
    public:
        CMainFrame();
        BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
        afx_msg void OnPaint();
        DECLARE_MESSAGE_MAP()
    };
     
    class CHelloApp : public CWinApp
    {
    public:
        BOOL InitInstance();
    };
     
    BOOL CHelloApp::InitInstance()
    {
        m_pMainWnd = new CMainFrame;
        m_pMainWnd->ShowWindow(m_nCmdShow);
        m_pMainWnd->UpdateWindow();
        return TRUE;
    }
     
    CHelloApp App;
     
    BEGIN_MESSAGE_MAP( CMainFrame, CFrameWnd )
        ON_WM_PAINT()
    END_MESSAGE_MAP()
     
    CMainFrame::CMainFrame()
    {
        Create( NULL, _T("Hello, World!") );
    }
     
    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
        CFrameWnd::PreCreateWindow(cs);
        cs.cx = 640;
        cs.cy = 480;
        return TRUE;
    }
     
    void CMainFrame::OnPaint()
    {
        CPaintDC dc(this);
        dc.TextOut( 0, 0, _T("Hello, Win32 GUI(MFC) World!") );
    }

    コンパイル方法

    C:¥> cl hello.cpp /link /SUBSYSTEM:WINDOWS

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(MFC) World!              |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  10. Hello, Win32 GUI(C++/CLI) World!

    Posted on 7月 5th, 2012 by cx20

    Win32 GUI(C++/CLI)

    Win32 アプリケーションは Windows 標準 API である Win32 API を使用した Windows アプリケーションである。
    以下は C++/CLI における Win32 GUI アプリケーション の例となっている。

    ソースコード

    #include <windows.h>
    #include <tchar.h>
     
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        PAINTSTRUCT ps;
        HDC hdc;
        LPCTSTR lpszMessage = _T("Hello, Win32 GUI(C++/CLI) World!");
     
        switch (message)
        {
        case WM_PAINT:
            hdc = BeginPaint( hWnd, &ps );
            TextOut( hdc, 0, 0, lpszMessage, lstrlen(lpszMessage) );
            EndPaint( hWnd, &ps );
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
            break;
        }
     
        return 0;
    }
     
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        LPCTSTR lpszClassName = _T("helloWindow");
        LPCTSTR lpszWindowName = _T("Hello, World!");
     
        WNDCLASSEX wcex;
        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = NULL;
        wcex.lpszClassName  = lpszClassName;
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
     
        RegisterClassEx(&wcex);
        HWND hWnd = CreateWindow(
            lpszClassName,
            lpszWindowName,
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
            NULL, NULL, hInstance, NULL
        );
     
        ShowWindow(hWnd, SW_SHOWDEFAULT);
        UpdateWindow(hWnd);
     
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
     
        return (int)msg.wParam;
    }

    コンパイル方法

    C:¥> cl /clr hello.cpp /link user32.lib gdi32.lib /SUBSYSTEM:WINDOWS

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(C++/CLI) World!          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+