Win32API
Windowsにおける標準API(Win32API)の呼び出しについてまとめます。
概要
以下の例ではLinux等の環境でもビルドできるようにするためversionで囲って表記しています。
- C言語では多くの場合 #include <windows.h> と記述しますが、Dでは import core.sys.windows.windows; と記述します。
- あとは利用する関数が含まれるlibファイルをリンクすればシステム関数が利用できます。
- dubでは設定ファイルの libs セクションにファイル名を拡張子を除いて書きます。
- pragma(lib, "ファイル名"); とする書き方もあります
以下の例ではLinux等の環境でもビルドできるようにするためversionで囲って表記しています。
See Also:
関数に対応するヘッダーとlibファイルはMicrosoft Docsのサイトから検索して見つけることができます。
https://docs.microsoft.com/en-us/windows/win32/api/_winmsg/
https://docs.microsoft.com/en-us/windows/win32/api/_winmsg/
Examples:
GetSystemMetrics関数を使ってシステム情報(マウスのボタン数)を取得する例です。
version (Windows) { import core.sys.windows.windows; auto n = GetSystemMetrics(SM_CMOUSEBUTTONS); assert(n >= 0); }
Examples:
GetComputerNameEx関数を使ってコンピューター名を取得する例です。
Windowsのシステム関数には末尾にAかWが付くものがあり、それぞれchar向けかwchar向けを表します。
Aが付く関数はシステムロケールに従って結果を返すため、多くはASCII文字列ですが日本語環境ではShift_JISになることがあります。
Wが付く関数はUnicodeで結果を返すため、そのままwcharの文字列として扱うことができます。
Wが付く関数はUnicodeで結果を返すため、そのままwcharの文字列として扱うことができます。
version (Windows) { import core.sys.windows.windows; // 適当な長さのバッファを確保しておきます。 DWORD length = 256; wchar[256] buf; BOOL ret = GetComputerNameExW(COMPUTER_NAME_FORMAT.ComputerNamePhysicalNetBIOS, buf.ptr, &length); assert(ret != 0); assert(0 < length && length <= 256); // 結果をスライスで取り出すことでwchar[]の文字列として利用できます。 wchar[] computerName = buf[0 .. length]; // wchar[]で確保したものはstd.convのtoでstringに変換することができます。 import std.conv : to; string strComputerName = computerName.to!string(); assert(0 < strComputerName.length && strComputerName.length <= 256); }