Improve this page Github へのログインが必要です。 簡単な修正は、ここから fork、オンライン編集、pull request ができます。 大きな修正については、 通常の clone で行って下さい。 Page wiki 関連するWikiページを参照・編集 English このページの英語版(原文)

Windowsプログラミング

このページは、Windows上でのDの実装に関して述べています。 当然ながら、 Windows特有のDの機能は他のプラットフォームでは使用できません。

Cの:

#include <windows.h>

の代わりに、Dでは以下を使用します:

import core.sys.windows.windows;

呼び出し規約

Cでは、Windows APIの呼び出し規約は __stdcall です。 Dでは単純に:

extern (Windows)
{
	/* ... 関数宣言 ... */
}

リンク属性Windowsによって、呼び出し規約と名前のmanglingの両方が、 Windowsと互換性のあるものになります。

Cで __declspec(dllimport)__declspec(dllexport) と書いていたものについては、export 属性を使ってください:

export void func(int foo);

関数本体がなければ、importされます。 関数本体があれば、exportされます。

Windows 実行ファイル

Windows GUI アプリケーションを D で書くことができます。 サンプルは \samples\d\winsamp.d などに幾つかあります。

以下が注意点です:

  1. エントリポイントとして、main 関数ではなく WinMain 関数が必要です。
  2. WinMain の内容は以下の通りです:
    import core.runtime;
    import core.sys.windows.windows;
    import std.string;
    
    extern (Windows)
    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                LPSTR lpCmdLine, int nCmdShow)
    {
        int result;
    
        void exceptionHandler(Throwable e) {
            throw e;
        }
    
        try
        {
            Runtime.initialize(&exceptionHandler);
            result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
            Runtime.terminate(&exceptionHandler);
        }
        catch (Throwable e) // キャッチされていない例外を全てキャッチ
        {
            MessageBoxA(null, e.toString().toStringz(), "Error",
                        MB_OK | MB_ICONEXCLAMATION);
            result = 0;     // 失敗
        }
    
      return result;
    }
    
    int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                  LPSTR lpCmdLine, int nCmdShow)
    {
        // ... ユーザーコードをここに挿入 ...
        return 0;
    }
    
    myWinMain() 関数が、ユーザのコードを書くところです。 WinMain 関数の残りは全て、Dの実行時システムの初期化と終了の 決まり文句です。
  3. 最低次の2行を含んだ、 .def (モジュール定義ファイル) が必要です:
    EXETYPE NT
    SUBSYSTEM WINDOWS
    
    これがないと、Win32は、アプリケーションの実行時に 常にコンソールウインドウを開こうとします。
  4. WinMain() の存在はコンパイラが認識し、 __acrtused_dll と phobos.lib ランタイムライブラリへの参照を自動的に追加します。

Windows プログラミングの例

140 を超える Windows での D でのコード例が Github レポジトリ で公開されています。