Windows
This describes the D implementation for 32 bit Windows systems. Naturally, Windows specific D features are not portable to other platforms.
Instead of the:
#include <windows.h>
of C, in D there is:
import std.c.windows.windows;
Calling Conventions
In C, the Windows API calling conventions are __stdcall. In D, it is simply:
extern (Windows)
{
/* ... function declarations ... */
}
The Windows linkage attribute sets both the calling convention and the name mangling scheme to be compatible with Windows.
For functions that in C would be __declspec(dllimport) or __declspec(dllexport), use the export attribute:
export void func(int foo);
If no function body is given, it's imported. If a function body is given, it's exported.
Windows Executables
Windows GUI applications can be written with D. A sample such can be found in \dmd2\samples\d\winsamp.d
These are required:
- Instead of a main function serving as the entry point, a WinMain function is needed.
- WinMain must follow this form:
import core.runtime; import std.c.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) { // catch any uncaught exceptions MessageBoxA(null, e.toString().toStringz, "Error", MB_OK | MB_ICONEXCLAMATION); result = 0; // failed } return result; } int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // ... insert user code here ... return 0; }
The myWinMain() function is where the user code goes, the rest of WinMain is boilerplate to initialize and shut down the D runtime system. - A .def
(Module Definition File)
with at least the following
two lines in it:
EXETYPE NT SUBSYSTEM WINDOWS
Without those, Win32 will open a text console window whenever the application is run. - The presence of WinMain() is recognized by the compiler causing it to emit a reference to __acrtused_dll and the phobos.lib runtime library.