potisanのプログラミングメモ

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

C#

C# Windows 10の拡張子の関連付け情報を文字列で取得するコードとクラス

Windows 10ではレジストリに記録される拡張子の関連付け情報が複雑で、レジストリを直接操作すると互換性が失われる可能性があります。shlwapi.dllの公開するAssocQueryStringW関数の使用でこの複雑さや互換性を解決できます。 なお、AssocQueryStringAでAns…

C# Windowsの拡張子の関連付けレジストリキーのハンドルと名前を取得するコード

Windows 10でレジストリから拡張子の関連付けキーのハンドルとその名前を取得するコードです。拡張子の関連付け情報を持つキーハンドルはWin32 APIのAssocQueryKeyW関数で取得できますが、.NET Core 3.1の標準機能ではレジストリキーハンドル(HKEY)の名前…

C#&Win API レジストリキーハンドルからキー名を取得する

動作確認環境:C# 8.0(.NET Core 3.1)、9.0(.NET 5.0) C#ではWin32 APIで取得したレジストリキーハンドルHKEYからMicrosoft.Win32.RegistryKeyを作成するとキーの名前(Nameプロパティ)が空の文字列""になります。ZwQueryKey関数に準ずるNtQueryKey関数…

C# 8 HTMLのスクリプト要素の一部をJSONとして抜き出す

C#

2021/3/10:この記事は別のブログで投稿した記事を移動したものです。 C# 8.0でHTMLのスクリプト要素の一部をJSONとして抜き出す方法の覚書です。この投稿ではSystem.Text.Json.JsonDocumentクラスを用いて不定形のJSONを扱います。スクリプト要素の一部がJS…

C# 8-9 UTF8EncodingのBOM出力とBOMを付けない方法

C#

2021/3/10:この記事は別のブログで投稿した記事を移動したものです。 C#でUTF8EncodingがBOMを出力することを確かめるにはGetPreambleメソッドを呼び出すかStreamWriterへ書き込みます。また、BOMを付けないにはUTF8Encodingのコンストラクタを引数なしまた…

C# 8-9 MemoryStreamとStreamWriterを組み合わせるときの注意点と対処

C#

C#でMemoryStreamとStreamWriterを組み合わせて使ったら遭遇した想定外の仕様を注意点と対処として記録します。 StreamWriterはFlushを呼び出すまでMemoryStreamへ書き込まれない 失敗するコード using var、トップレベルステートメント(C# 9.0) using {..…

C# .NET Core 3.1 NtQuerySystemInformation関数でSystemProcessInformationを取得するコード

C#

2021/3/10:この記事は別のブログで投稿した記事を移動したものです。 C# (.NET Core 3.1)でNtQuerySystemInformation関数を用いてSystemProcessInformationの情報を取得するコードの覚書です。動作確認環境はMicrosoft Visual Studio Community 2019 Versio…

JavaScript (MDN)のArray反復メソッドとC# (.NET Core 3.1, Microsoft Docs)のLINQ

JavaScript (MDN web docs, 2020/01/14時点)のArrayの反復メソッドを基準としたC# (.NET Core 3.1)のLINQとの比較です。車輪の再発明に該当すると思いますが、JavaScriptの勉強のために。 JavaScript C# 概要 entries(...) Select((item, index) => ...)(直…

C# 8 P/Invoke時の「System.MissingMethodException: '.ctor'」例外の意味

C#

結論 戻り値の型(クラス)がデフォルトコンストラクタを定義していない場合に発生します。自作クラスであればデフォルトコンストラクタを定義してください。なお、'.ctor'はコンストラクタを意味します。 例 Microsoft.Win32.SafeHandleZeroOrMinusOneIsInv…

Windows BS_SPLITBUTTONとHDF_SPLITBUTTON

C#の標準コントロール(Button、ColumnHeader)で実装されていないので気付きませんでしたが、Button(標準コントロール)、Header(コモンコントロール)にスプリットボタン機能が追加されていました。 ButtonではウィンドウスタイルのBS_SPLITBUTTON、Head…

C# 現在使用されているMicrosoft Windows SDKの場所とバージョンを取得する

C#で現在使用されているMicrosoft Windows SDKの場所とバージョンを取得するにはレジストリを参照します。64ビット環境で32ビットアプリケーションを起動した場合、WOW64により異なるキーを参照してしまうことに注意してください。 レジストリキーの場所 HKE…

C# Image.FromFileの代替法とその短所

C#

C#のImage.FromFileメソッドは戻り値のImage型オブジェクトが解放されるまでファイルがロックされる仕様が知られています。 この仕様を回避するため、File.OpenメソッドとImage.FromStreamメソッドを組み合わせた代替法が知られています。この代替法を使用し…

C# 9 IShellItemインターフェイスをパスから作成する

IShellItemインターフェイスをパスから作成して表示名、親フォルダとその表示名を取得するサンプルコードです。 using System; using System.Runtime.InteropServices; var item = default(IShellItem); try { item = NativeMethods.SHCreateItemFromParsing…

C# BitmapData.Scan0の操作でAccessViolationException例外が発生する理由と対処

本文 Image.FromHbitmap関数で作成したビットマップのような一部のビットマップではBitmap.LockBitsメソッドが返すBitmapDataのStrideが負の値になります。このようなビットマップはボトムアップ形式と呼ばれ、Scan0はビットマップの最終列の最初のピクセル…

R.NETがすごい!

C# R

R.NETがすごいです。C#の標準機能では提供されない主成分分析やグラフ画像の作成を簡単かつ信頼できる方法で実行できます。詳細は以下のリンクから。また、Microsoft Visual Studio 2019であればNuGet パッケージマネージャーからプロジェクトへお手軽にイン…

C# SHObjectProperties関数を使用してファイル、プリンター、ボリュームのプロパティダイアログを開く

C#

概要 C#でファイル、プリンター、ボリュームのプロパティダイアログを開く方法にはSHFileOperationEx関数、IShellFolderインターフェイスとIContextMenuインターフェイス等がありますが、SHObjectProperties関数を使用することでより簡単に実現することがで…

C# SearchPath関数を使用して既定の順番でパスを検索する

C#

概要 Windowsではファイル名を指定された場合のパスの検索順序がレジストリに保存されており、「ファイル名を指定して実行」やLoadLibrary関数等ではこの順序が使用されます。この検索機能はSearchPath関数で公開されており、C#でもP/Invokeにより使用するこ…

C# ドロップされたデータのフォーマット形式を列挙する

DragEventArgs eとComTypes.IDataObject型 DragDropイベントなどで使用されるe.DataはSystem.Windows.Forms.IDataObject型ですが、System.Runtime.InteropServices.ComTypes.IDataObject型(以下ComTypes.IDataObject型)へ明示的に変換することができます。…

C# レジストリの間接文字列から対応するテキストリソースを抽出するクラス

概要 shlwapi.dllのSHLoadIndirectString関数を使用してレジストリで使用されるindirect string("@location,id"等)を元の文字列に変換するクラスとサンプルコードです。この表記は主にレジストリで使用され、DLLに含まれる文字列リソースを参照する場合に…

C# 文字列のANSI文字列→Unicode文字列変換時の注意

C#

概要 ANSI文字列(ここでは純粋なASCIIエンコーディングの文字列ではなくシステム上でANSI版として扱われる文字列。日本語ではShift-JISエンコーディングの文字列)を格納したバイト配列byte[]をstring型へ変換する場合等、ANSI文字列を扱う場合はエンコーデ…

C# P/Invoke時の文字列型マーシャリングの考察

C#

概要 文字列型の引数を伴うプラットフォーム呼び出し(P/Invoke)を実行するとき、引数の型によりマーシャリング動作が変わります。具体的にはC#側がstring/StringBuilder/byte型、プラットフォーム側(C/C++側)がLPWSTR/LPSTR(UnmanagedType.LPWStr/LPStr…

C# 8-9 ASCII、Unicode、システムのANSIエンコーディングの概要を表示する

C#

各種エンコーディング(ASCIIエンコーディング、Unicodeエンコーディング、言語設定により指定されたシステムのANSIエンコーディング)の概要とそれを取得するサンプルコードです。 出力例 サンプルコード C# 9.0(トップレベルステートメント) C# 8.0 出力…

C# 7.1 コントロールパネルに表示される項目のCLSIDと名前をレジストリから取得する

はじめに コントロールパネルに表示される項目のCLSIDと名前(登録上の名前)をレジストリから取得する方法です。 コード using System; using System.Linq; using Microsoft.Win32; namespace ConsoleApp1 { class Program { static void Main(string[] arg…

C# コントロールパネルに表示される項目のローカライズされた名前をレジストリから取得する

参照設定 下記投稿のクラスを使用しています。 ドロップされたOLEデータオブジェクトのクリップボード形式実例 コード using System; using System.Collections.Generic; using System.Linq; using Microsoft.Win32; using Oxalis.Windows.Text; namespace C…

C# コントロールパネルに表示される項目のCLSIDをレジストリから取得する

はじめに コントロールパネルに表示される項目のCLSIDをレジストリから取得する方法です。 コード using System; using System.Linq; using Microsoft.Win32; namespace ConsoleApp1 { class Program { static void Main(string[] args) { using (var key = …

C# 実行ファイルやDLL(PE形式のファイル)からバージョン情報を取得する

C#

実行ファイルやDLL(PE形式のファイル)のバージョン情報は.NET Frameworkや.NET Coreの標準機能で取得することができます。具体的にはSystem.Diagnostics名前空間のFileVersionInfoクラスを使用します。 .NET Coreのみ(トップレベルステートメントはC# 9以…

C# IContextMenuのGetCommandStringにリソースIDではまったときの記録

IContextMenuでメモ帳のコンテキストメニューの情報を取得していたら、説明(コンテキストメニューの項目選択時にステータスバーに表示される内容)の取得でメモリ例外が発生しました。簡単な状況と解決策をメモします。 例外の発生方法は次の通りです。 メ…

C# バイトサイズを文字列に変換する関数群

バイトサイズを文字列に変化する関数群のサンプルコードです。Shell Lightweight Utility Functions(Microsoft)の仕様変更により、Windows 10からは1 KB = 1000バイトであることに注意してください。 using System; using System.ComponentModel; using Sy…

C# HRESULTからWin32エラーコードへ変換する関数群

namespace ConsoleApp1 { class Program { static void Main() { const int hr = unchecked((int)0x8007007a); var facility = Utility.GetHRFacility(hr); var win32errcode = Utility.GetWin32ErrorCodeFromHR(hr); } } public static partial class Utili…

C# レジストリに登録されたCOMインターフェイスの情報を取得するクラスとサンプル

レジストリに登録されたInterface(HKCR\Interfaceのサブキー)の情報を取得するクラスCOMInterfaceInfoとそのサンプルコードです。 COMInterfaceInfoのソースコード COMInterfaceInfo.cs using System; using System.Collections.Generic; using System.Dia…