D 1.0   D 2.0
About Japanese Translation

Last update Sun Jan 20 11:40:02 2008

Win32 での D

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

Cの:

#include <windows.h>

の代わりに、Dでは:

import std.c.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 で書くことができます。 サンプルは \dmd\samples\d\winsamp.d などに幾つかあります。

次が必要です:

  1. エントリポイントとして、main 関数ではなく WinMain 関数が必要です。
  2. WinMain は次の通りです:
    import std.c.windows.windows;
    
    extern (C) void gc_init();
    extern (C) void gc_term();
    extern (C) void _minit();
    extern (C) void _moduleCtor();
    extern (C) void _moduleDtor();
    extern (C) void _moduleUnitTests();
    
    extern (Windows)
    int WinMain(HINSTANCE hInstance,
    	HINSTANCE hPrevInstance,
    	LPSTR lpCmdLine,
    	int nCmdShow)
    {
        int result;
    
        gc_init();			// ガベージコレクタ初期化
        _minit();			// モジュールコンストラクタテーブル初期化
    
        try
        {
    	_moduleCtor();		// モジュールコンストラクタ呼び出し
    	_moduleUnitTests();	// 単体テスト実行 (オプション)
    
    	result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
    
    	_moduleDtor();		// モジュールデストラクタ呼び出し
        }
    
        catch (Object o)		// キャッチされていない例外を全てキャッチ
        {
    	MessageBoxA(null, cast(char *)o.toString(), "Error",
    		    MB_OK | MB_ICONEXCLAMATION);
    	result = 0;		// 失敗
        }
    
        gc_term();			// ファイナライザの実行、ガベージコレクタ終了
        return result;
    }
    
    int myWinMain(HINSTANCE hInstance,
    	HINSTANCE hPrevInstance,
    	LPSTR lpCmdLine,
    	int nCmdShow)
    {
        /* ... ユーザーコードをここに挿入 ... */
    }
    
    myWinMain() 関数が、ユーザのコードを書くところです。 WinMain 関数の残りは全て、Dの実行時システムの初期化と終了の 決まり文句です。
  3. 最低次の2行を含んだ、 .def (モジュール定義) ファイル:
    EXETYPE NT
    SUBSYSTEM WINDOWS
    
    これがないと、Win32は、アプリケーションの実行時に 常にコンソールウインドウを開こうとします。
  4. WinMain() の存在はコンパイラが認識し、 __acrtused と phobos.lib ランタイムライブラリへの参照を自動的に追加します。