Archive for the ‘D言語’ Category

  1. Hello, Win32 GUI(D言語) World!

    Posted on 7月 19th, 2012 by cx20

    Win32 GUI(D言語)

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

    ソースコード

    import core.runtime;
    import std.c.windows.windows;
    import std.string;
     
    extern(Windows)
    LRESULT WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
        case WM_PAINT:
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint( hWnd, &ps );
            enum text = "Hello, Win32 GUI(D) World!";
            TextOutA( hdc, 0, 0, text, text.length );
            EndPaint( hWnd, &ps );
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProcA(hWnd, message, wParam, lParam);
            break;
        }
     
        return 0;
    }
     
    extern(Windows)
    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        string className = "helloWindow";
        string windowName = "Hello, World!";
        HWND hWnd;
        MSG  msg;
        WNDCLASSA wc;
     
        wc.style         = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc   = &WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIconA(null, IDI_APPLICATION);
        wc.hCursor       = LoadCursorA(null, IDC_ARROW);
        wc.hbrBackground = cast(HBRUSH)(COLOR_WINDOW+1);
        wc.lpszMenuName  = null;
        wc.lpszClassName = className.toStringz;
     
        RegisterClassA(&wc);
        hWnd = CreateWindowA(className.toStringz, 
                             windowName.toStringz,
                             WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
                             null, null, hInstance, null);
     
        ShowWindow(hWnd, SW_SHOWDEFAULT);
        UpdateWindow(hWnd);
     
        while (GetMessageA(&msg, null, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessageA(&msg);
        }
     
        return msg.wParam;
    }

    コンパイル方法

    C:¥> dmd -L/subsystem:windows gdi32.lib hello.d

    実行結果

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

    Posted on 5月 29th, 2012 by cx20

    COM(D言語)

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

    ソースコード

    import std.c.stdio;
    import std.c.windows.windows;
    import std.c.windows.com;
    import std.stdio;
    import std.variant;
     
    pragma(lib, "ole32.lib");
    pragma(lib, "oleaut32.lib");
     
    GUID CLSID_Shell         = { 0x13709620, 0xC279, 0x11CE, [0xA4, 0x9E, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00] };
    GUID IID_Folder          = { 0xBBCBDE60, 0xC3FF, 0x11CE, [0x83, 0x50, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00] };
    GUID IID_FolderItem      = { 0xFAC32C80, 0xCBE4, 0x11CE, [0x83, 0x50, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00] };
    GUID IID_FolderItems     = { 0x744129E0, 0xCBE5, 0x11CE, [0x83, 0x50, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00] };
    GUID IID_IShellDispatch  = { 0xD8F015C0, 0xC278, 0x11CE, [0xA4, 0x9E, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00] };
     
    alias DWORD* DWORD_PTR;
    alias uint LCID;
    alias uint REFIID;
    alias uint DISPID;
    alias uint DISPPARAMS;
    alias uint EXCEPINFO;
    alias wchar*  BSTR;
    alias uint ITypeInfo;
    alias short VARIANT_BOOL;
    alias double DATE;
     
    enum /*VARENUM*/ : ushort {
      VT_I4               = 3
    }
     
    struct VARIANT {
     
      union {
        struct {
          /// Describes the type of the instance.
          ushort vt;
          ushort wReserved1;
          ushort wReserved2;
          ushort wReserved3;
          union {
            int lVal;
          }
        }
      }
    }
     
    extern (System) {
        interface IDispatch : IUnknown {
            HRESULT GetTypeInfoCount(UINT *pctinfo);
            HRESULT GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
            HRESULT GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
            HRESULT Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
        }
     
        interface FolderItemVerb : IDispatch
        {
            HRESULT Application (IDispatch **ppid);
            HRESULT Parent(IDispatch **ppid);
            HRESULT Name(BSTR *pbs);
            HRESULT DoIt();
        }
     
        interface FolderItemVerbs : IDispatch
        {
            HRESULT Count(LONG *plCount);
            HRESULT Application (IDispatch **ppid);
            HRESULT Parent(IDispatch **ppid);
            HRESULT Item(VARIANT index, FolderItemVerb **ppid);
            HRESULT _NewEnum(IUnknown **ppunk);
        }
     
        interface FolderItem : IDispatch
        {
            alias FolderItem* LPFOLDERITEM;      // For C callers
            HRESULT Application (IDispatch **ppid);
            HRESULT Parent(IDispatch **ppid);
            HRESULT Name(BSTR *pbs);
            HRESULT Name(BSTR bs);
            HRESULT Path(BSTR *pbs);
            HRESULT GetLink(IDispatch **ppid);
            HRESULT GetFolder(IDispatch **ppid);
            HRESULT IsLink(VARIANT_BOOL *pb);
            HRESULT IsFolder(VARIANT_BOOL *pb);
            HRESULT IsFileSystem(VARIANT_BOOL *pb);
            HRESULT IsBrowsable(VARIANT_BOOL *pb);
            HRESULT ModifyDate(DATE *pdt);
            HRESULT ModifyDate(DATE dt);
            HRESULT Size(LONG *pul);
            HRESULT Type(BSTR *pbs);
            HRESULT Verbs(FolderItemVerbs **ppfic);
            HRESULT InvokeVerb(VARIANT vVerb);
        }
     
        interface FolderItems : IDispatch
        {
            HRESULT Count(LONG *plCount);
            HRESULT Application (IDispatch **ppid);
            HRESULT Parent(IDispatch **ppid);
            HRESULT Item(VARIANT index, FolderItem **ppid);
            HRESULT _NewEnum(IUnknown **ppunk);
        }
     
        interface Folder : IDispatch
        {
            HRESULT Title(BSTR *pbs);
            HRESULT Application (IDispatch **ppid);
            HRESULT Parent(IDispatch **ppid);
            HRESULT ParentFolder(Folder **ppsf);
            HRESULT Items(FolderItems **ppid);
            HRESULT ParseName(BSTR bName, FolderItem **ppid);
            HRESULT NewFolder(BSTR bName, VARIANT vOptions);
            HRESULT MoveHere(VARIANT vItem, VARIANT vOptions);
            HRESULT CopyHere(VARIANT vItem, VARIANT vOptions);
            HRESULT GetDetailsOf(VARIANT vItem, LONG iColumn, BSTR *pbs);
        }
     
        interface IShellDispatch : IDispatch
        {
            HRESULT get_Application( IDispatch **ppid);
            HRESULT get_Parent( IDispatch **ppid);
            HRESULT NameSpace( VARIANT vDir, Folder **ppsdf);
            HRESULT BrowseForFolder( LONG Hwnd, BSTR Title, LONG Options, VARIANT RootFolder /*, Folder **ppsdf */);
            HRESULT Windows( IDispatch **ppid);
            HRESULT Open( VARIANT vDir);
            HRESULT Explore( VARIANT vDir);
            HRESULT MinimizeAll();
            HRESULT UndoMinimizeALL();
            HRESULT FileRun();
            HRESULT CascadeWindows();
            HRESULT TileVertically();
            HRESULT TileHorizontally();
            HRESULT ShutdownWindows();
            HRESULT Suspend();
            HRESULT EjectPC();
            HRESULT SetTime();
            HRESULT TrayProperties();
            HRESULT Help();
            HRESULT FindFiles();
            HRESULT FindComputer();
            HRESULT RefreshMenu();
            HRESULT ControlPanelItem( BSTR bstrDir);
        }
    }
     
    int main( char[][] args )
    {
        HRESULT hr;
        IShellDispatch pShell;
     
        VARIANT vRootFolder;
        vRootFolder.vt = VT_I4;
        vRootFolder.lVal = 36;
        vRootFolder.wReserved1 = 0;
        vRootFolder.wReserved2 = 0;
        vRootFolder.wReserved3 = 0;
     
        hr = CoInitialize(null);
        hr = CoCreateInstance(&CLSID_Shell, null, CLSCTX_ALL, &IID_IShellDispatch, &pShell);
        hr = pShell.BrowseForFolder( 0, cast(wchar*)"Hello, COM(D) World!", 0, vRootFolder );
     
        CoUninitialize();
        return 0;
    }

    実行方法

    C:¥> dmd hello.d

    実行結果

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

    Posted on 5月 4th, 2012 by cx20

    Win32 API(D言語)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は D言語 からの呼出し例である。
    D言語では、Platform SDK のヘッダファイル相当のものがプロトタイプ宣言されている為、基本的な Win32 API であれば、C/C++ の場合と同様に、呼び出すことが可能となっている。

    ソースコード

    import std.c.windows.windows;
     
    int main( char[][] args )
    {
        MessageBoxA( null, "Hello, Win32 API(D) World!", "Hello, World!", MB_OK );
        return 0;
    }

    Win32 API のプロトタイプ宣言(参考)

    extern (Windows)
    {
          :
    int MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
    int MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
          :
    }

    また、Win32 データ型に関しても、同じ名前の型が、D言語用に定義されている為、特段、言語の差異を意識することなく使うことが可能となっている。

    Win32 データ型 C/C++ データ型 D言語データ型
    HANDLE void * void *
    BYTE unsigned char ubyte
    SHORT short short
    WORD unsigned short ushort
    INT int int
    UINT unsigned int uint
    LONG long int
    BOOL int int
    DWORD unsigned long uint
    ULONG unsigned long uint
    CHAR char char
    WCHAR wchar_t wchar
    LPSTR char * char *
    LPCSTR const char * const(char) *
    LPWSTR wchar_t * wchar *
    LPCWSTR const wchar_t * const(wchar) *
    FLOAT float float
    DOUBLE double double
    LONGLONG __int64 long
    DWORD64 unsigned __int64 ulong

    コンパイル方法(Digital Mars D コンパイラ)

    C:¥> dmd hello.d

    実行結果

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

    Posted on 12月 12th, 2011 by cx20

    D言語

    D言語はC言語の後継を狙った比較的新しい言語である。
    仮想マシンを使うJavaやC#と違い、ネイティブコンパイル(直接マシン語に変換される)の為、実行速度は速い。

    ソースコード

    import std.stdio;
     
    int main( char[][] args )
    {
        writefln( "Hello, D World!" );
        return 0;
    }

    コンパイル方法(GNU D コンパイラ)

    $ gdc -o hello hello.d

    コンパイル方法(Digital Mars D コンパイラ)

    $ dmd hello.d

    実行結果

    Hello, D World!