potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++

C++ Windows環境で絵文字のstd::iswgraphがfalseな理由の考察

VC++ではワイド文字列(L"...")に絵文字を含めることができます。この文字列に対してstd::iswgraphを適用しても戻り値はfalseです。 #include <string> #include <cwctype> #include <iostream> #include <iomanip> int main() { const std::wstring s{ L"" }; for (auto i = s.cbegin(); i != s</iomanip></iostream></cwctype></string>…

C++ UTF-16サロゲートペア判定とUTF-16/UTF-32文字列の相互変換

UTF-16サロゲートペア判定とUTF-16/UTF-32文字列の相互変換コードです。Unicodeの仕様はネット上の解説ページを参照しているため、間違えてる可能性もあります。 #include <algorithm> #include <string> namespace u16_surrogatepair { const char16_t high_surrogate_first =</string></algorithm>…

C++&Win API 設定(Windows設定アプリ)を表示する

設定(Windows設定アプリ)を表示する ms-settings URIスキーマとShellExecute/ShellExecuteEx関数を使用して設定(Windows設定アプリ)を表示できます。 設定のトップを表示するには次のようにします。 ShellExecute版 #define STRICT #include <Windows.h> int main()</windows.h>…

C++&Win32 API プロパティシステムに登録されたプロパティの正規名と取り得る値を列挙する

Windowsのプロパティシステムに登録されたプロパティの正規名(Canonical Name)と取り得る値(Possible Value)を列挙するサンプルです。PSGetPropertySystemでIPropertySystemを取得した後、IPropertyDescriptionList→IPropertyDescription→IPropertyEnumT…

C++ Windows環境のMSVCで標準出力に日本語とASCII以外の文字を出力する

Windows環境で標準出力に(std::wcoutが認識する)日本語とASCII以外の文字を出力するには_setmode(_fileno(stdout), _O_U16TEXT);を呼び出します。この呼び出しの後、標準ライブラリはユニコードモードになるそうです。 #include <iostream> #include <io.h> #include <fcntl.h> int </fcntl.h></io.h></iostream>…

C++&Win32 API MMDevice API (Core Audio APIs)によるデバイス情報の取得

トップ/C++言語関係 Windows Vistaから導入されたMMDevice API(Core Audio APIs)を使用してデバイス情報を取得するサンプルです。WIL(NuGetのMicrosoft.Windows.ImplementationLibraryパッケージ)を使用した場合はコードにバージョンを記載しています。…

C++20&Win32 API フォントの名前を列挙する

C++20とWin32 APIでフォントの名前を列挙するコードです。 フォント情報の列挙にはEnumFontFamiliesExW関数を使用します。これはHDCとLOGFONTW構造体等を引数とするコールバック関数を受け取ります。HDCに使用するスクリーンのHDCはGetDC関数で取得してRelea…

C++ std::multimap

標準ライブラリのSTLコンテナ、キーの重複を許すマップstd::multimap(以下multimap)についてのメモです。 初期化子リストによる初期化 要素数やキーに対応した値の個数の取得 要素の追加 あるキーを持つ要素の列挙 あるキーを持つ要素をまとめて削除 その…

C++17&Win32 API デバイス情報要素の文字列プロパティ(概要、クラス、クラスGUID、フレンドリーネーム、ハードウェアID)を列挙・整理する

デバイス情報要素の文字列プロパティ(概要、クラス、クラスGUID、フレンドリーネーム、ハードウェアID)を列挙するコードです。再利用可能なコードをUtility.hppへ移動しています。 文字列プロパティ(概要、クラス、クラスGUID、フレンドリーネーム、ハー…

C++17&Win32 API デバイス情報要素のGUID、不透明ハンドル、概要を列挙する

デバイス情報要素のGUID、不透明ハンドル(Opaque Handle)、概要を列挙するサンプルコードです。C++&Win32 API デバイス情報要素のGUIDと不透明ハンドルを列挙するの拡張です。 #include <array> #include <memory> #include <string> #include <numeric> #include <iostream> #include <tuple> #include <list> #pr</list></tuple></iostream></numeric></string></memory></array>…

C++&Win32 API デバイス情報要素のGUIDと不透明ハンドルを列挙する

Windows NT系列でデバイス情報要素のGUIDと不透明ハンドル(Opaque Handle)を列挙するサンプルコードです。 SP_DEVINFO_DATA構造体として取得する 最も単純な方法としてSP_DEVINFO_DATA構造体のまま取得するサンプルコードです。追記:一部のSetup API(Set…

C++11 整数→整数の2進接頭辞バイト単位リテラルの定義

C++

C++11から導入されたユーザー定義リテラル(cpprefjp)を使用すると2進接頭辞バイト単位リテラル(KiB等)を定義できます。 1KiBを1024に変換するような整数型への変換は次のように書けます。 constexpr unsigned long long operator""KiB(unsigned long lon…

C++20 Win32 APIでウィンドウにHLSグラデーションを描画する

Win32 APIでウィンドウにHLS色空間のグラデーションを描画するコードです。"win32_hls_color.hpp"ヘッダーファイルのwin32_hls_colorクラスは以前の投稿のコードを使用しています。 右側の画像の一番上に黒い横線がクラス設計か画像処理の問題かは悩んでいま…

C++20 Win32 APIを使用したHLS色空間クラス

Win32 API、具体的にはShell lightweight utility functions(Microsoft Docs)のColorHLSToRGB関数、ColotRGBToHLS関数を使用したHLS色空間クラスです。 std::clampを使っているので動作環境をC++20としていますが、適当に書き換えればC++17以前にも対応で…

C++20 Win32 APIでウィンドウにDIBセクションを描画する

Win32 APIでウィンドウを表示して、CreateDIBSection関数で作成したビットマップを描画するサンプルコードです。 CreateDIBSection関数で作成したビットマップはppvBits引数に与えた変数の内容をビットマップデータとして直接操作できます。ここでは赤と黒の…

C++17 Win32 APIでウィンドウを表示する

Win32 APIでウィンドウを表示するよくあるサンプルコードです。ウィンドウのクライアント領域に青い正方形を描画します。 #include <memory> #define STRICT #define NOMINMAX #include <Windows.h> static const auto MainWindowClassName = L"MainWindow"; static const auto </windows.h></memory>…

C++17&Win32 API STRRET型出力引数をstd::wstring型で受け取るクラス

Win32 APIで使われるSTRRET型の出力引数をstd::wstring型で受け取るクラスのコードです。 // out_STRRET_into_wstring.hpp #include <string> // 同じwstringを受け取るインスタンスを同時に使用しないでください。 // 次のようなコードは不適切です。 // // std::ws</string>…

C++20 std::numeric_limitsが対応する型の制約

C++

std::numeric_limits<T>はTが対応する型(特殊化する型)ならis_specializedがtrueとなるため、以下のコンセプトでstd::numeric_limits<T>が対応する型に制約できます。 #include <numeric> template <typename T> concept limited_number = std::numeric_limits<T>::is_specialized; 以下</t></typename></numeric></t></t>…

C++&Win32 API モジュールハンドル(HMODULE)は実行可能ファイルのメモリマップトファイルアドレス

公式ドキュメントは確認していませんが、Windows NT系列ではモジュールハンドルHMODULEは実行可能ファイルのメモリマップトファイルアドレスらしいです。なので、GetModuleHandleやLoadLibraryで取得したモジュールハンドルをchar型文字列にキャストすると最…

C++&Win32 API 実行ファイルデータ、スタックのアドレスを取得する

実行ファイルデータのアドレスはWin32 APIのGetModuleHandle関数やWinMain関数の引数、スタックのアドレスはローカル変数のアドレスとして取得できます。また、関数のアドレスを取得することで関数が実行ファイルデータとして配置されることが推測できます。…

C++ size_t→DWORDキャスト時の注意(UINT、std::uint32_t、unsigned int等)

C++

STLはsize_t、Win32 APIはDWORD(あるいはUINT)を使う場合が多いです。size_tからDWORDへは暗黙にキャストできますが、範囲外が切り捨てられる可能性があるのでコンパイル警告が発生します。Cスタイルキャスト(DWORD)...やキャスト演算子static_cast<DWORD>(...)に</dword>…

C++20 生のポインタをstd::spanで扱う

std::spanでは生のポインタもSTLコンテナと同様に扱えます1。生ポインタの操作は通常推奨されませんが、WinAPIは連続したメモリ領域に異なる型を複数配置する場合があり、その場合に使用することになります。例えばFILESYSTEM_STATSTICS_EX構造体の直後にEXF…

C++20&WinAPI DeviceIoControl(FSCTL_FILESYSTEM_GET_STATISTICS_EX)のラッパークラス

C++20におけるWinAPIのDeviceIoControl(FSCTL_FILESYSTEM_GET_STATISTICS_EX)のラッパークラスです。ファイルは本体であるDeviceIoControlForFileSystemStatisticsExを定義するDeviceIoControlForFileSystemStatisticsEx.hpp、再利用可能そうなコードを集…

C++20 std::ranges::subrangeのメンバー関数使用例(Microsoft Visual Studio 2019 Community 16.9.0 Preview 3)

Microsoft Visual Studio 2019 Community 16.9.0 Preview 3におけるstd::ranges::subrangeのメンバー関数使用例です。 #include <ranges> #include <vector> int main() { std::vector v{ 0, 1, 2, 3, 4 }; // std::ranges::subrange r{ v }; std::ranges::subrange r(v.cbeg</vector></ranges>…

C++20 std::span、std::basic_string_view、std::ranges::subrangeの使い分け

C++20には所有権を持たず範囲を表すクラスとしてstd::span、std::basic_string_view、std::ranges::subrangeが用意されています。これらの概要は以下の通りです。 クラス 概要 std::span 連続したメモリ領域の部分を参照する。 std::basic_string_view 文字…

C++20 コンセプト関係のメモ

C++20のコンセプト関係のメモです。 std::destructibleはnoexcept(true)なデストラクタを持つクラスを含まない std::constructible_fromコンセプトはnoexcept(true)なデストラクタを持つクラスを含まない ある型が特定の型の引数から構築可能か調べる std::r…

C++17-20 文字列をある文字で分割した文字列ビューのベクターを作成する

C++で文字列をある文字で分割した文字列ビューのベクターを作成するコードです。コンセプトを使用したC++20以降用のコード、std::basic_string_viewを使用したC++17以降用のコードを記載しています。 C++20以降用のコード あまり使う機会はありませんがbasic…

C++/WinRT バッテリーのデバイスセレクター文字列とレポートを取得する

動作確認環境 ソースコード 名前空間の省略、元の型の優先 名前空間の省略、auto型の優先 名前空間の明記、元の型の優先 説明 WinRTの使用に関する事項 WinRTの一般事項 コード特有の事項 MicrosoftのWinRTリファレンス 動作確認環境 Microsoft Visual Studi…

MSVS Community 2019 16.9.0 Preview 3.0でC++/WinRT開発を有効にする

Microsoft Visual Studio Community 2019 16.9.0 Preview 3.0でC++/WinRT開発を有効にしたとき、いくつかの準備が必要でした。具体的にはVisual Studioで次の操作を実行します。順番は自由です。 機能:「ツールと機能を取得」で「ユニバーサル Windows プラ…

C++&STL ワイド文字列の静的配列からstd::vector<std::wstring>を作成する

本文 C++でワイド文字列の静的配列(const wchar_t ...[];)からstd::vector<std::wstring>へ変換するにはstd::vector<std::wstring>のコンストラクタを使用します。引数には静的配列の(変換したい範囲の)最初と最後要素のアドレスを渡します。このコンストラクタはcpprefjpではイテレ</std::wstring></std::wstring>…