potisanのプログラミングメモ

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

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

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++17 基本的なSTL要素操作

C++

2021/3/10:この記事は別のブログで投稿した記事を移動したものです。 C++17とSTLを用いた基本的な要素操作の方法の覚書です。 コンテナの要素を標準出力へ一括出力する ostream_iterator、cout/wcout、copyを組み合わせることで配列やコンテナクラス(vecto…

C++11 IMAGE_COR20_HEADERを取得する

概要 32ビット形式のPEファイルを生データとして解析してIMAGE_COR20_HEADER構造体を取得するサンプルコードです。実際にはIMAGE_COR20_HEADER構造体のメインであろうメタデータは今後の拡張に備えてフォーマット非公開なのでCLSID_CorMetaDataDispenserで公…

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

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

Win32 API リソースIDのマクロ

概要 Win32 APIのリソースIDの定義や操作で使用されるマクロの簡単な情報です。具体的には次のマクロの概要を説明します。 IS_INTRESOURCE MAKEINTRESOURCE[A/W] リソースIDは環境(32、64ビットあるいはA/W)に関わらず、16ビットの範囲内にあれば整数型、…

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

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

C++ ドロップされたOLEデータオブジェクトのクリップボード形式実例

はじめに Windows 10 64 bit環境でウィンドウにドロップしたときのOLEデータオブジェクトに含まれるクリップボード形式の確認結果です。詳細は各自ご確認下さい。 出力例 デスクトップからPCをドロップ c0ca (Shell IDList Array) c0d3 (Preferred DropEffec…

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

C#

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

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

C#

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

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

C#

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

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

C#

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

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

C#

追記20240903 現行のC# 12では$"""..."""形式で複数行の文字列補間を使用できます。このリテラル?はFormattableString型のオブジェクトとして使いまわせるので、静的関数の実装も不要です。 各種エンコーディング(ASCIIエンコーディング、Unicodeエンコー…