potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

2014-01-01から1年間の記事一覧

Python 3.4 RubyのDir.chdir(path) {...}様の処理

はじめに Python 3.4(3?)の__enter__、__exit__を使うとRubyのDir.chdir(path) {...}の様にブロックを抜けたらカレントディレクトリを元に戻す様な処理も簡単に書けます。また、contextlib.contextmanagerデコレーター(3.4リファレンス)を使うこともで…

Python 3.4 あるディレクトリに存在するファイルの名前からShift_JISで表現できない文字を削除する

追記20240902 最近のPythonではos.listdirやos.renameの替わりにpathlibを使えます。 あるディレクトリに存在するファイルの名前(UTF-16)からShift_JISで表現できない文字を削除します。実際にはファイル名をUTF-16で取得して、Shift_JISへ変換できない文…

C++ EFLAGSの値とCPUID命令の使用可否を確認する(32ビット限定)

C++

VC++のインラインアセンブリを用いてEFLAGSレジスタの値とCPUID命令の使用可否を確認するコードです。EFLAGSレジスタの独特な扱い、詳細についてはネットで調べるとすぐ出てくるかと思います。__asmを使用しているため、32ビット限定です。 class eflags { p…

C# 9 チェックディスクのイベントログを選択する

System.Diagnostics.EventLogを用いて、システムのイベントログからチェックディスクのログを選択するサンプルコードです。 チェックディスクのインスタンスIDは公式のドキュメントが見つからなかったので、実際に列挙して該当したものを自前で定義していま…

C# 9 チェックディスクのイベントログをボリュームラベルで分類して取得する

チェックディスクのイベントログをボリュームラベルで分類して取得する方法です。標準機能のSystem.Diagnostics.EventLogがとても便利です。 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.T…

C# 9&Win32 API ウィンドウハンドルを列挙する機能を提供するクラス

ウィンドウハンドルを列挙する機能を提供するクラスのコードです。 // ウィンドウのウィンドウハンドルを階層構造付きで列挙するサンプルコード using System; using System.Collections.Generic; using System.Runtime.InteropServices; foreach (var handl…

C# 9 Tool Help Functionsを利用してプロセス、スレッド、モジュール、ヒープリストのスナップショットを作成するクラス

前書き Windows XPから導入されたTool Help Functionsを利用してプロセス、スレッド、モジュール、ヒープリストのスナップショットを作成するクラスのコードです。 ソースコード // Potisan.Windows.ToolHelp32.cs using System; using System.Collections.G…

C# 5.0 DeviceIoControl関数でボリュームの物理ドライブを取得する

目的とサンプルコード Win APIを用いてデバイス名からボリュームデバイスのハンドルを開いたり、DeviceIoControl関数を用いてボリューム(論理ボリューム)の所属する物理ドライブを取得するサンプルコードです。 DiskExtent構造体やGetDiskExtentsメソッド…

C++11 Win32 Setup APIでシステムに存在するデバイスのクラス・インターフェイスのクラスと説明を列挙する

Win32 Setup APIでシステムに存在するデバイスのクラス・インターフェイスのクラスと説明を列挙するコードです。main関数内ではメモリ管理や例外処理を怠っているので注意して下さい。 単純に列挙する #pragma comment(lib, "SetupAPI.lib") #define STRICT …

C++11 STLの標準入出力にsetfill/setwをまとめて設定するヘルパー構造体&関数

はじめに C++とSTL(Standard Template Library)で標準(エラー)出力(std::cout、std::cerr)を使用して整数などを出力するとき、出力形式を指定するにはstd::hexやstd::setw/setfillといった関数を利用します。 このstd::setw/setfillは一度出力すると消…

C# 9 ごみ箱内のファイル名を列挙する

はじめに Windows 7から実装されたSHGetKnownFolderIDList関数を用いてゴミ箱内のファイルの名前を列挙します。インターフェイスのコードはPInvoke.netをとても参考にしています。例外処理などは目をつぶっているので注意して下さい。 ソースコード using Sy…

C# 9 &Win32 API ごみ箱のファイル数とサイズを取得するクラス

実行するとドライブ毎のゴミ箱に存在するファイルの数とサイズを列挙します。 using System; using System.IO; using System.Runtime.InteropServices; foreach (var driveInfo in DriveInfo.GetDrives()) { Console.WriteLine(driveInfo.Name); if (Recycle…

C++11 STLで文字列から特定の文字を除去する

はじめに 文字列から文字を除去するには様々な方法がありますが,ここではC++11で導入されたラムダ式とSTLのremove_if,remove_copy_ifを組み合わせて文字を削除する方法を書き残しておきます.なお,MBCSとかだと扱えなくなるので別の処理が必要だと思いま…

C# Win32 APIを使ってバイトの単位を変換する

C#でWin APIのShell Lightweight Utility Functionsを用いてバイトの単位を変換する補助関数のコードです。拡張メソッドとして定義していますが、thisを外せば関数として利用することもできます。this UInt64 value等のUInt64部分を変更することで対応する型…

C++17&WinAPI 64ビットPEファイルのデータディレクトリの物理アドレスを取得する

ベタ書きですが、C++で64ビットPEファイルの各種ヘッダーとデータディレクトリの物理アドレスを取得するサンプルです。 IMAGE_OPTIONAL_HEADERのDataDirectory[]に含まれるIMAGE_DATA_DIRECTORYの実体はIMAGE_SECTION_HEADERの指す各セクションに含まれてお…

C# MemoryMappedViewAccessorとMarshalを組み合わせた小物関数

追記20241011:現在のC#ではstackalloc、Span、MemoryMarshalを使ってアンマネージな型(該当する構造体含む)はスタック上で読み込めます。クラスの場合はMarshal.PtrToStructureが必要ですが、高速化する場合は使い分けた方が良いかもしれません。 メモリマ…

C++11&Win API MMDevice APIを利用してマスター音量を操作する

Windows Vistaまではマスター音量(システム全体の音量)を変更するにはmixer~系のAPIが使われていました。しかし諸々の事情により、Windows VistaからはCOMベースのMMDevice API (Windows Multimedia Device API)が用いられているそうです。この投稿ではサ…

C++11 STL&WRL&MMDevice APIでオーディオエンドポイントを列挙する

はじめに 前回の投稿ではWRLとMMDevice APIを用いてデバイスとそのプロパティの取得を行いました。今回はそのコードを改変してデバイスの列挙を行います。 サンプルコード 以下にコードを示します。 #pragma comment(lib, "propsys.lib") #include <memory> #include <string></string></memory>…

C++&Win API ドライブのジオメトリ情報(物理的なサイズ情報)の取得(IOCTL_DISK_GET_DRIVE_GEOMETRY_EX)

DeviceIoControl関数を用いてドライブの物理ディスクジオメトリ情報(物理的なサイズ情報)を取得するサンプルコードです。この投稿ではIOCTL_DISK_GET_DRIVE_GEOMETRY_EXを用いた場合を紹介します。詳細な説明はいつか。 サンプルコード #include <bit> #include <string></string></bit>…

C++11 WRLでWindows Vista以降のマルチメディアデバイスを操作する

はじめに Microsoft Visual Studio 2013ではATLとよく似た機能を提供するWRL(Windows Runtime C++ Template Library)を利用することができます。特にExpress版を利用している場合はATLが同梱されないのでWRLが唯一の選択肢となります。 この投稿ではWindows…

Ruby 2 Fiddle/Win32APIでWin32 APIのUnicode版を呼び出す時はUTF-16LEエンコーディングが必要

Win32APIパッケージからFiddleパッケージへの乗り換えようとして、Unicode文字列(WCHAR, LPWSTR, LPCWSTR, OLECHAR, LPOLESTR, LPCOLESTR)を扱う関数、特にAnsi版が存在しないOLE関数周りで文字化けが起きて困っていました。 文字コードについて色々と調べ…

Ruby 2 DOSISHなパス(「\」(バックスラッシュ)区切りのパス)を整形する

本文 File::globで取得されたファイルパスの様に始めからRubyで取得されたファイルパスなら良いのですが、環境変数やWin32 APIが絡んでくるとパス区切りに「\」(バックスラッシュ)が使われます(DOSISH)。今回はそれにとりあえず対処するためのコードです…