potisanのプログラミングメモ

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

2020-11-01から1ヶ月間の記事一覧

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

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

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

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

C# 絶対サイズ指定の構造体は全体コピーされる

C#

C# 9.0ではStructLayout属性のSize引数を指定した構造体は通常のコピーでも全部(Sizeバイト分)コピーされます。P/Invoke以外ではメンバー変数のカバー範囲だけコピーされるかと思っていましたが、カバー範囲外もコピーされていました。Win32 APIのVARIANT…

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

C++20 レンジについて調べたこと

C++20のレンジについて調べたことの覚え書きです。 ここで扱うレンジ ここでは<ranges>ヘッダーで定義されるstd::ranges::range<T>コンセプトを満たす型をレンジとして扱います。range<T>の要件は型Tの変数tに対してstd::ranges::begin(t)とstd::ranges::end(t)が定義され</t></t></ranges>…

C++20 Rangesプロジェクションの動作確認用コード

動作確認用に作成したコードのメモです。以下のコードではstd::ranges::range<T>コンセプトを満たす型をレンジあるいはrange<T>として表記することもあります。 プロジェクションとは? range<optional<int>>の各要素の空判定を出力する。 range<optional<int>>の無効値を-1に変換して各要素を</optional<int></optional<int></t></t>…

C++ Function-try-block(関数tryブロック)

関数tryブロック WILでの利用 MSVCのコンストラクタにおける不思議な挙動 参考 関数tryブロック WILのGitHub Wikiを読んでいたら関数名の後ろ、constやnoexceptのある部分にtry、関数の直後にcatchのあるコードを見かけました。main関数で示せば次のような感…

C++17 STL variant、any、optional

C++にはintやdoubleといったC言語と共通の組み込み型(基本型)に加えてSTLの提供する型を使用できます。ここではSTLの提供する型のうち複数の型の値や無効値を一つの型としてまとめて扱う型variant、any、optionalを紹介します。 概要 variant any optional…

WIL GitHub Wiki ビット操作ヘルパーの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiからビット操作ヘルパーの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。 ビット演算ヘルパー Duncan Horn、2020…

WIL GitHub Wiki アドホック範囲ヘルパーの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiからアドホック範囲ヘルパーの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。 アドホック範囲ヘルパー Raymond C…

C++ STLスマートポインタのconst修飾の不思議と解釈

C++

STLのスマートポインタ(std::unique_ptr)のgetメンバー関数がT* get() constと戻り値にconstが存在しないことに悩んでいましたが、以下の質問サイトの回答を読んで腑に落ちました。スマートポインタの指す値をconstにするにはTをconst Tとするようです。 s…

C++17 右辺値参照とRVO

C++

次のコードのs3、s4の逆アセンブリが予想と違いました。 #include <string> int main() { std::wstring s1(L"abc"); std::wstring s2(L"def"); std::wstring s3(s1 + s2); // 一時オブジェクトで初期化 std::wstring s4(std::move(s1 + s2)); // 右辺値参照で初期化 </string>…

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++20 STLのrangeをvectorに変換する関数

C++20のコンセプトとrangesの学習用コードです。template <std::ranges::range T>のようにtypenameやclassの代わりにコンセプトを指定することで型Tをコンセプトで制限できます。コンセプトにrangeを指定すればrangeをvectorに変換する関数を定義できます。 template <std::ranges::range T>はrequiresで</std::ranges::range></std::ranges::range>…

C# Math.NET Numericsで正規分布に従う乱数の発生と平均の標準誤差の推定量計算

C#

C#ではGitHubでMITライセンス公開されているMath.NET Numericsを使用して、正規分布に従う乱数の発生と記述統計量の計算ができます。計算できる記述統計量には不偏標準偏差も含まれるため、以下のようにして正規分布に従う乱数から平均の標準誤差の推定量を…