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