potisanのプログラミングメモ

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

Windows

C++&Win32 API ICU4Cでユニコードを扱う

Windows 10 バージョン 1903以降、最新のSDKではicu.h、icu.lib、icu.dllからICU4Cを使用できます。ICU4Cを使えばUnicode関係の詳細な処理が可能です。ここでは動作確認用のコードを公開します。 参考 この投稿を書く際に参照したページです。 International…

C#&VS2019 C#プロジェクトが開けなくなったとき

できごと:いつの間にかVisual Studio 2019 PreviewでC#プロジェクトが作れるのに開けなくなった。dotnetコマンドでもSDKやランタイムが表示されなかった。 解決方法:Program Files\dotnetフォルダとProgram Files\dotnet\sdksの存在を確認した後、Program …

C++20&WinAPI PEファイルのバージョン情報を取得する

Ver系関数を使ってPEファイルのバージョン情報を取得するサンプルコードです。ひっそりとstd::format(実質fmt)を使用しています。 #include <format> #include <string> #include <span> #include <unordered_map> #include <vector> #define STRICT #define NOMINMAX #include <Windows.h> #pragma comment(lib, "v</windows.h></vector></unordered_map></span></string></format>…

C++&WinAPI CLSID_QuickLinksに対するIDeskBand::GetBandInfoが必ず失敗する

以下のコードの(☆)が不正なメモリアクセス(アドレス0の操作)で確実に失敗します。原因は不明です。 先に実行しているIDeskBand::GetWindowはE_FAILを返すので、こちらで判別は可能かもしれません。 #define STRICT #define NOMINMAX #define WIN32_LEAN_AN…

Windows&Sysinternals コマンドプロンプトでshell32.dllの文字列を抜き出す

実行に必要なstrings64 (Sysinternals)はMicrosoftからダウンロードできます。 7文字以上のANSI/Unicode文字列を抜き出す。 SET STRINGS64_PATH="<string64のインストールディレクトリ>\strings64" %STRINGS64_PATH% -a -u -nobanner %windir%\system32\shell32.dll | findstr ".......*"</string64のインストールディレクトリ>

C# 9.0&Win32 API レジストリからプロパティシステムの拡張子情報を取得する

レジストリからプロパティシステムの拡張子情報を取得するサンプルコードです。情報源はMicrosoftの公式ドキュメントです。 ドキュメントの記載に従い、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlersに登…

C# 9&Win API カレントユーザーのレジストリに登録された実行ファイルのAppIDを取得する

カレントユーザーのレジストリに登録された実行ファイルのAppIDを取得するサンプルです。HKEY_CLASSES_ROOT\AppIDレジストリキーのうち、キー名が{GUID}形式ではないキーを扱います。AppIDレジストリキーの詳細はMicrosoft Docsを参照ください。 // 必要なNu…

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# Spy++とメッセージを監視するアプリケーションの対象プラットフォームは揃える

Spy++でアプリケーションのメッセージを監視する場合はそれらの対象プラットフォームを揃える必要があります。対象プラットフォームが異なる場合、Spy++はメッセージを監視できません。詳細はIntroducing Spy++ - Visual Studio | Microsoft Docsを参照して…

C#&Win32 API ソートマークやスプリットボタンに対応したリストビューコントロール(ListViewEx)

リストビュー(ListView)から派生してソートマークやスプリットボタン(ドロップダウン用)に対応したリストビューコントロールのコードです。 Program.cs ListViewEx.cs 関連記事 Program.cs using System; using System.Drawing; using System.Windows.Fo…

C#&Win32 API Win32 APIのRECT構造体と.NET 5.0のRectangle構造体は互換性がない

Win32 APIのRECT構造体と.NET 5.0のRectangle構造体は互換性がありません。C#でRECTを使う場合、一度RECTとして取得してからRectangleへ変換する必要があります。 C#のRECT構造体ラッパー // [StructLayout(LayoutKind.Sequential)] struct RECT { public in…

C#10&Win32 API リストビューのヘッダーにソートマークやドロップダウン(スプリットボタン)を表示する

概要 Program.cs ListViewHeaderUtility.cs 概要 標準コントロールのリストビューはWin32 APIのリストビュー(コモンコントロール)を元に作成されています。したがって、ListView.Handleを使えばWin32 APIのリストビューと同様の手順でソートマークやスプリ…

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++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++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++&Win32 API モジュールハンドル(HMODULE)は実行可能ファイルのメモリマップトファイルアドレス

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

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

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

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

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

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 プラ…

17 C++&Win32 API ファイルの多言語対応リソースの言語とファイルパスを取得する

C++とWin32 APIでファイルの多言語対応リソース(Microsoft Docsでは「language-specific resource files」)の言語名とMUIファイルパスを取得するサンプルコードです。 // 動作確認環境:C++ 17 #include <io.h> #include <fcntl.h> #include <array> #include <filesystem> #include <iostream> #includ</iostream></filesystem></array></fcntl.h></io.h>…