potisanのプログラミングメモ

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

Windows

C# imageres.dll.munからProgressRingのリソース(PNGデータ)を読み込む

動作確認環境:C# 9.0 preview C#でimageres.dll.munからProgressRingのリソースのPNGデータを読み込むサンプルコードです。実際には複数のPNGリソースが保管されているため、代表としてリソースID 5021を読み込んでいます。 Win32APIのLockResource関数はリ…

Windows 10のimageres.dllのリソースはimageres.dll.munに移動された

Windows 10のリソースについて調べていると%WINDIR%\System32\imageres.dllがヒットします。以前はこのDLLにいくつかのリソースが保存されていましたが、現在は次の場所に移動されています。 %WINDIR%\SystemResources\imageres.dll.mun .munという拡張子は…

C++&WIL パスを含むドライブがSSD等か確認する

動作確認環境:MSVC、C++20 (preview) Win32 APIのDeviceIoControl関数とIOCTL_STORAGE_QUERY_PROPERTYフラグを使ってパスを含むドライブがSSD等か確認するサンプルコードです。オリジナルのソースコードはMicrosoft BlogのThe Old New ThingでRaymond Chen…

WIL GitHub Wiki 型検証ヘルパーの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiから記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。 型検証ヘルパー(原題:Type validation helpers) Raymond …

WIL GitHub Wiki string_makerの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。 string_maker Raymond Chen、2020/1/24、リビジョン1個 wil::d…

WIL GitHub Wiki テンプレートメタプログラミングヘルパーの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。 テンプレートメタプログラミングヘルパー(原題:Template met…

C# 9.0 Windows 10の拡張子の分類情報等を取得する

Windows 10で拡張子の分類情報など(Perceived Type等)を取得するにはWin32APIのAssocGetPerceivedType関数を使用します。以下はそのサンプルコードです。recordやnew (...)を使用しているのでC# 9.0以降対応です。 using System; using System.Runtime.Int…

C# WinAPIを使ったHLS色構造体

動作確認環境:C# 9.0(.NET 5) WinAPIを使ったHLS色構造体のコードです。Color型およびタプル(Tuple<ushort, ushort, ushort>およびValueTuple<ushort, ushort, ushort>)との相互変換をサポートしています。Colorとは異なりひとつの整数で表すことを前程としないため、IComparableおよびIComparable<T>は実装</t></ushort,></ushort,>…

C# 9.0 P/Invokeで使う構造体の管理方法いくつか

C#ではP/Invokeで使う構造体をいくつかの方法で実装できます。ここでは実用性は別としていくつかの方法を紹介します。ボックス化の回避などは割愛しています。 構造体として扱う 通常の構造体 読み取り専用構造体 絶対サイズ指定の構造体 絶対サイズ指定の読…

C# 9.0 メモリ割り当て文字列のカスタムマーシャラー

はじめに カスタムマーシャラー CoTaskMem→Unicode文字列 HLOCAL→Unicode文字列 FormatMessageWの例 参考 はじめに C#では以下の手順でアンマネージ関数のP/Invoke時にマーシャリングをカスタマイズできます。 ICustomMarshalerインターフェイスを実装したク…

C# プロパティシステムのサンプルコード

C# .NET5.0(.net5.0-windows)でWindowsのプロパティシステムの情報を操作する自分用のサンプルコードを記録しています。 シェルアイテムのプロパティの名前から値(PROPVARIANT)を取得する。 シェルアイテムのプロパティの名前から値(書式化文字列)を取…

WIL GitHub Wiki イベントハンドラの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。 イベントハンドラ(原題:Event handles) Raymond Chen、2020…

C++&WIL ファイルシステムオブジェクトのプロパティ情報を列挙する

C++20とWIL(バージョン)でプロパティシステムを使ってファイルシステムオブジェクトのプロパティ情報を列挙するサンプルコードです。 サンプルコード 出力例 サンプルコード // 動作確認環境: // C++20 // WIL 1.0.201120.3 #include <algorithm> #include <iostream> #include <ranges></ranges></iostream></algorithm>…

C++ WinAPIのPSFormatForDisplayAlloc関数の返す文字列がコンソールで異常な文字(Unicode directional characters)を含む

ファイルシステムオブジェクトのプロパティ値をコンソールへ出力していたら、あるオブジェクトの更新日時(System.DateModified)以降が出力されなくなりました。原因はIPropertySystem::FormatForDisplayAlloc(PSFormatForDisplayAlloc)関数の仕様「フラ…

C++&WIL Windowsプロパティシステムのプロパティ情報を列挙する

C++20とWILでWindowsプロパティシステムのプロパティ情報を列挙するサンプルコードです。コードの変更でプロパティの他の情報も列挙できます。 コード 出力例 コード #include <iostream> #include <string> #pragma comment(lib, "propsys.lib") #define STRICT #include <Windows.h> #in</windows.h></string></iostream>…

WIL GitHub Wiki マクロによるメタプログラミングの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiからマクロによるメタプログラミングの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。 マクロによるメタプログラ…

WIL (Windows Implementation Libraries)関係の記事

MicrosoftがGitHubでMITライセンス公開しているWIL (Windows Implementation Libraries)関連の記事です。現在はGitHub Wikiの和訳・改変と使用例が主です。 GitHub Wikiの和訳・改変 WILの使用例 リンク GitHub Wikiの和訳・改変 RAIIリソースラッパー 文字…

C++ WILとWindows Update Agent APIでWindows Updateの更新履歴(タイトル、説明)を取得する

WILとWindows Update Agent APIでUpdateSearcherを作成・管理してWindows Updateの更新履歴からタイトルと説明を取得するサンプルコードです。タイトルと説明以外には日付等の難しい型が含まれるため、いったん無視しています。 // C++20 #include <iostream> #include <vector></vector></iostream>…

C++ WILとWindows Update Agent APIでWindows Update関連のシステム情報を取得する

WILとWindows Update Agent APIでSystemInformationを作成・管理してWUA API関連のシステム情報(OEMハードウェアサポートリンク、リブート要求)を取得するサンプルコードです。 #include <iostream> #define STRICT #define NOMINMAX #include <Windows.h> #include <wuapi.h> #include <wil/com.h> </wil/com.h></wuapi.h></windows.h></iostream>…

C++ WILとWindows Update Agent APIでWUA APIのバージョンを取得する

WILとWindows Update Agent API(WUA API)でWindowsUpdateAgentInfoを作成・管理してWUA APIのバージョンを取得するサンプルコードです。 // C++20 #include <iostream> #pragma comment(lib, "propsys.lib") #define STRICT #define NOMINMAX #include <Windows.h> #include <propvarutil.h> #i</propvarutil.h></windows.h></iostream>…

C++ VariantToStringの戻り値はCoTaskMem関係

<propvarutil.h>のVariantToString関数は新しく割り当てたメモリを返しますが、そのメモリを解放すべきかどうかの記載が一切ありません。CoGetMallocで取得したIMallocのGetSizeは正しい値を返すので、おそらくCoTaskMemFree関数で解放すればよいのではないかと想像します。</propvarutil.h>…

C++ InitVariantFromStringで作成されるVARIANTはVT_BSTR

InitVariantFromString関数(<propvarutil.h>)はVARIANTをvt == VT_BSTR(vt == 8)で初期化します。Microsoft DocsのVariantClearの記述からVariantClearが解放するのはVT_BSTR、VT_DISPATCH、VT_ARRAYとあるため、VT_LPWSTRやVT_LPSTRは避けられたと考えられます。 #defi</propvarutil.h>…

PowerShell 7 Windows 10 1909でWindowsUpdateProviderは廃止済み?

Google検索でPowerShellではWindowsUpdateProviderモジュールでWindows Updateの情報を取得できるという記事を見つけたのですが、PowerShell 7で以下のコマンドを入力したら空の出力が返されました。 Get-Command -Module WindowsUpdateProvider 窓の杜の記…

WIL GitHub Wiki WinRT&COMラッパーの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub WikiからWinRT and COM wrappersの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。 一部のリンク切れは意図的なもので…

WIL GitHub Wiki safe_castの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiからsafe_castの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。 一部のリンク切れは意図的なものです。原文をご…

WIL GitHub Wiki 文字列ヘルパーの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiから文字列ヘルパーの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。 一部のリンク切れは意図的なものです。原文…

WIL GitHub Wiki RAIIリソースラッパーの和訳・改変

2022/9/19:2020/8/25版→2022/3/5版に修正しました(そしてミスをしました)。 MicrosoftがGitHubでMITライセンス公開しているWILのGitHub WikiからRAIIリソースラッパーの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などあ…

C++ STLのスマートポインタが&演算子をオーバーロードしないのはshared_ptrのため?

C++によるWindows開発ではATLとSTLが使えます。ATLがメモリ管理クラス(CComPtrやCComHeapPtr)に&演算子を実装して内部ポインタのポインタ取得を可能にしている一方、STLはスマートポインタ(unique_ptrやshared_ptr)に&演算子を実装していません。STLの方…

C++ WILでCOMを扱う

C++でWindows開発する場合、MicrosoftがGitHubでMITライセンス公開するWIL(Windows Implementation Libraries)を使えます。WILはSTLと類似した設計でムーブ(譲渡)や範囲forに対応しており、put()、wil::out_param、wil::out_param_ptrによりATLのような…

C# IShellFolder::GetAttributesOfの定義時の注意

IShellFolder::GetAttributesOfの最後の引数はマスクにも使われるので戻り値に移動できない。 C#でWin32 APIのIShellFolder::GetAttributesOfメソッドを利用する場合は戻り値をvoid(エラーを手動処理する場合はint)型にします。他のメソッドのように最後の…