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 などに幾つかあります。
次が必要です:
- エントリポイントとして、main 関数ではなく WinMain 関数が必要です。
- 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の実行時システムの初期化と終了の 決まり文句です。 - 最低次の2行を含んだ、
.def
(モジュール定義)
ファイル:
EXETYPE NT SUBSYSTEM WINDOWS
これがないと、Win32は、アプリケーションの実行時に 常にコンソールウインドウを開こうとします。 - WinMain() の存在はコンパイラが認識し、 __acrtused と phobos.lib ランタイムライブラリへの参照を自動的に追加します。