IPropertySystem
COM公式ドキュメント
プロパティの説明の取得、プロパティスキーマの登録および登録解除、プロパティの説明の列挙、そしてプロパティ値を型に厳密な方法で書式設定するためのメソッドを公開します。
解説(Remarks)
エクスポートされている API の多く(PSGetPropertyDescription など)は、単に IPropertySystem のメソッドをラップしたものです。多数のヘルパー API を連続して呼び出すコードの場合は、ヘルパー API を呼び出す代わりに、単一の IPropertySystem オブジェクトをインスタンス化してメソッドを直接呼び出す方が有効なことがあります。(パフォーマンスを向上させるため、ヘルパー API は IPropertySystem オブジェクトのキャッシュされたインスタンスを取得します。)
メソッド 9
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定した PROPERTYKEY のプロパティの説明を取得するために、IPropertyDescription を実装したサブシステムオブジェクトのインスタンスを取得します。
| propkey | PROPERTYKEY* | in | 目的のプロパティキーへの参照です。PROPERTYKEY を参照してください。 |
| riid | GUID* | in | 目的の IID への参照です。 |
| ppv | void** | out | IPropertyDescription インターフェイスポインターのアドレスです。 |
戻り値
型: HRESULT
次のいずれかの値を返します。
| 戻り値コード | 説明 |
|---|---|
| インターフェイスが取得されたことを示します。 | |
| ppv が NULL であることを示します。 | |
| PROPERTYKEY がスキーマサブシステムのキャッシュに存在しないことを示します。 |
解説(Remarks)
objbase.h で定義されている IID_PPV_ARGS マクロを使用して、riid パラメーターと ppv パラメーターをまとめることをお勧めします。このマクロは ppv の値が指すインターフェイスに基づいて正しい IID を提供するため、コーディングエラーの可能性を排除できます。
指定した正規名のプロパティの説明を取得するために、IPropertyDescription を実装したサブシステムオブジェクトのインスタンスを取得します。
| pszCanonicalName | LPWSTR | in | プロパティを識別する文字列へのポインターです。 |
| riid | GUID* | in | 目的の IID への参照です。 |
| ppv | void** | out | IPropertyDescription インターフェイスポインターのアドレスです。 |
戻り値
型: PSSTDAPI
次のいずれかの値を返します。
| 戻り値コード | 説明 |
|---|---|
| インターフェイスが取得されたことを示します。 | |
| pszCanonicalName が NULL であることを示します。 | |
| 正規名がスキーマサブシステムのキャッシュに存在しないことを示します。 |
解説(Remarks)
objbase.h で定義されている IID_PPV_ARGS マクロを使用して、riid パラメーターと ppv パラメーターをまとめることをお勧めします。このマクロは ppv の値が指すインターフェイスに基づいて正しい IID を提供するため、コーディングエラーの可能性を排除できます。
指定した文字列に基づいてプロパティの説明の順序付きコレクションを取得するために、IPropertyDescriptionList を実装したサブシステムオブジェクトのインスタンスを取得します。
| pszPropList | LPWSTR | in | プロパティリストを識別する文字列へのポインターです。 |
| riid | GUID* | in | 目的の IID への参照です。 |
| ppv | void** | out | IPropertyDescriptionList インターフェイスポインターのアドレスです。 |
戻り値
解説(Remarks)
プロパティの説明リスト文字列("proplist")の構文は、正規プロパティ名の並びで構成され、各プロパティ名にはフラグが関連付けられます。文字列は "prop:" で始まります。構文は次のようになります: prop:[flags]propertyname[endflags];
フラグは省略可能で、以下のいずれかを指定できます。注: これらのフラグは PROPDESC_VIEW_FLAGS 列挙体に対応します。
| フラグ | 意味 |
|---|---|
| - | 逆順で並べ替えます (PDVF_REVERSESORT)。 |
| 0 | プライマリリストとセカンダリリストの両方に既定で表示します (PDVF_SHOWBYDEFAULT | PDVF_SHOWINPRIMARYLIST | PDVF_SHOWINSECONDARYLIST)。 |
| 1 | プライマリリストとセカンダリリストに表示します (PDVF_SHOWINPRIMARYLIST | PDVF_SHOWINSECONDARYLIST)。 |
| 2 | セカンダリリストに表示します (PDVF_SHOWINSECONDARYLIST)。 |
| ^ | 新しいグループを開始します (PDVF_BEGINNEWGROUP)。 |
| / | 右揃えにします (PDVF_RIGHTALIGN)。 |
| * | 値が存在しない場合は非表示にします。 |
| | | 中央揃えにします。(PDVF_CENTERALIGN)。 |
| ~ | ラベルを非表示にします。(PDVF_HIDELABEL)。 |
| # | 領域を埋めます。(PDVF_FILLAREA)。 |
| ? | プロパティハンドラーでサポートされていない場合は非表示にします (PDVF_HIDEIFUNSUPPORTED)。 |
| < | リンクとして解析します (PDVF_PARSEASLINK)。 |
| & | 全体をリンクとして表示します (PDVF_SHOWASWHOLELINK)。 |
dbfolder およびファイルフォルダーの観点からは次のとおりです:
| 0 | defview、列選択メニュー、および列選択ダイアログに列として表示します。 |
| 1 | 列選択メニューおよびダイアログに表示します。 |
| 2 | 列選択ダイアログに表示します。 |
| NULL | 検索結果には含めますが、UI では非表示にします。 |
endflags も省略可能で、次を指定できます:
| 終了フラグ | 意味 |
|---|---|
| ] | 列を終了します(拡張タイル表示で使用されます)。 |
objbase.h で定義されている IID_PPV_ARGS マクロを使用して、riid パラメーターと ppv パラメーターをまとめることをお勧めします。このマクロは ppv の値が指すインターフェイスに基づいて正しい IID を提供するため、コーディングエラーの可能性を排除できます。
プロパティスキーマの詳細については、 Property Schemas を参照してください。
システム内のプロパティの説明の一覧全体または一部を取得するために、IPropertyDescriptionList を実装したサブシステムオブジェクトのインスタンスを取得します。
| filterOn | PROPDESC_ENUMFILTER | in | 返す一覧です。PROPDESC_ENUMFILTER を参照してください。このメソッドで有効な値は 0 から 4 です。 |
| riid | GUID* | in | 目的の IID への参照です。 |
| ppv | void** | out | IPropertyDescriptionList インターフェイスポインターのアドレスです。 |
戻り値
解説(Remarks)
このメソッドは BUILDING_DOWNLEVEL_LIB が定義されている環境では実装されていません。
objbase.h で定義されている IID_PPV_ARGS マクロを使用して、riid パラメーターと ppv パラメーターをまとめることをお勧めします。このマクロは ppv の値が指すインターフェイスに基づいて正しい IID を提供するため、コーディングエラーの可能性を排除できます。
プロパティ値の書式設定された Unicode 文字列表現を取得します。(IPropertySystem.FormatForDisplay)
| key | PROPERTYKEY* | in | 要求するプロパティキーへの参照です。 |
| propvar | PROPVARIANT* | in | プロパティの型と値を格納する PROPVARIANT 構造体への参照です。 |
| pdff | PROPDESC_FORMAT_FLAGS | in | プロパティ文字列の書式です。指定可能な値については PROPDESC_FORMAT_FLAGS を参照してください。 |
| pszText | LPWSTR | out | 書式設定された値を null で終わる Unicode 文字列として受け取ります。呼び出し側アプリケーションがバッファーのメモリを割り当てる必要があります。 |
| cchText | DWORD | in | 終端の NULL を含む、pszText のバッファーの長さ(WCHARs 単位)です。最大サイズは 0x8000 (32K) です。 |
戻り値
型: HRESULT
次のいずれかの値を返します。
| 戻り値コード | 説明 |
|---|---|
| 書式設定された文字列が作成されました。 | |
| 書式設定された文字列は作成されませんでした。S_FALSE は、空文字列が VT_EMPTY に起因することを示します。 | |
| メモリの割り当てに失敗しました。 |
解説(Remarks)
IPropertySystem::FormatForDisplay を呼び出す前に、CoInitialize または OleInitialize でコンポーネントオブジェクトモデル (COM) を初期化する必要があります。
成功すると、このメソッドは指定した PROPERTYKEY と 1 つ以上の PROPDESC_FORMAT_FLAGS に対するプロパティ値の書式設定された Unicode 文字列表現を取得します。PROPERTYKEY がスキーマサブシステムで認識されない場合、IPropertySystem::FormatForDisplay はその VARTYPE に従って値を書式設定しようとします。
このメソッドの目的は、データをユーザーへの表示に適した文字列に変換することです。値は、現在のロケール、ユーザーの言語、PROPDESC_FORMAT_FLAGS、およびプロパティキーで指定されたプロパティの説明に従って書式設定されます。プロパティの説明スキーマが値の書式設定にどのように影響するかについては、displayInfo、stringFormat、booleanFormat、numberFormat、NMDATETIMEFORMAT、および enumeratedList を参照してください。通常、PROPDESC_FORMAT_FLAGS は、プロパティの説明で規定された書式を変更するために使用されます。
出力文字列には Unicode の方向制御文字が含まれる場合があります。これらの非スペーシング文字は Unicode 双方向アルゴリズムに影響を与え、左から右 (LTR) の言語が右から左 (RTL) のウィンドウ上に描画される場合(およびその逆の場合)に値が正しく表示されるようにします。これらの文字には次のものが含まれます: "\x200e", "\x200f", "\x202a", "\x202b", "\x202c", "\x202d", "\x202e".
次の表のプロパティは特殊な書式を使用し、PROPDESC_FORMAT_FLAGS の影響を受けません(記載されている例は、現在のロケールが英語に設定されている場合の文字列です。通常、特に記載のない限り出力はローカライズされます)。
| プロパティ | 書式 |
|---|---|
| System.FileAttributes | 次のファイル属性が文字に変換され、連結されて文字列が作成されます(たとえば、0x1801 (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_COMPRESSED | FILE_ATTRIBUTE_OFFLINE) という値は "RCO" に変換されます):
|
| System.Photo.ISOSpeed | たとえば "ISO-400"。 |
| System.Photo.ShutterSpeed |
APEX 値は、次の式を使用して露出時間に変換されます:
たとえば "2 sec." や "1/125 sec."。 |
| System.Photo.ExposureTime | たとえば "2 sec." や "1/125 sec."。 |
| System.Photo.Aperture |
APEX 値は、次の式を使用して F 値に変換されます:
たとえば "f/5.6"。 |
| System.Photo.FNumber | たとえば "f/5.6"。 |
| System.Photo.SubjectDistance | たとえば "15 m" や "250 mm"。 |
| System.Photo.FocalLength | たとえば "50 mm"。 |
| System.Photo.FlashEnergy | たとえば "500 bpcs"。 |
| System.Photo.ExposureBias | たとえば "-2 step"、" 0 step"、または "+3 step"。 |
| System.Computer.DecoratedFreeSpace | たとえば "105 MB free of 13.2 GB"。 |
| System.ItemType | たとえば "Application" や "JPEG Image"。 |
| System.ControlPanel.Category | たとえば "Appearance and Personalization"。 |
| System.ComputerName | たとえば "LITWARE05 (this computer)" や "testbox07"。 |
プロパティキーが登録済みのいずれのプロパティスキーマ内のプロパティの説明にも対応しない場合、このメソッドは次の表に示すように値の型に基づいて書式を選択します。
| 値の型 | 書式 |
|---|---|
| VT_BOOLEAN | サポートされていません。 |
| VT_FILETIME | PROPDESC_FORMAT_FLAGS と現在のロケールで指定された日付/時刻文字列です。既定値は PDFF_SHORTTIME と PDFF_SHORTDATE です。たとえば "11/13/2006 3:22 PM"。 |
| 数値 VARTYPE | 現在のロケールでの 10 進文字列です。たとえば "42"。 |
| VT_LPWSTR またはその他 | 文字列です。"\r"、"\t"、または "\n" の並びは単一のスペースに置き換えられます。 |
| VT_VECTOR | 任意の型 | セミコロン区切りの値です。ロケールに関係なくセミコロンが使用されます。 |
プロパティ値の文字列表現を、割り当てられたメモリバッファーに取得します。
| key | PROPERTYKEY* | in | 目的の PROPERTYKEY への参照です。 |
| propvar | PROPVARIANT* | in | プロパティの型と値を格納する PROPVARIANT 構造体への参照です。 |
| pdff | PROPDESC_FORMAT_FLAGS | in | プロパティ文字列の書式です。PROPDESC_FORMAT_FLAGS を参照してください。 |
| ppszDisplay | LPWSTR* | out | このメソッドが返るときに、書式設定された値へのポインターを null で終わる Unicode 文字列として格納します。 |
戻り値
型: HRESULT
次のいずれかの値を返します。
| 戻り値コード | 説明 |
|---|---|
| 書式設定された文字列が作成されました。この文字列は、入力文字列が空である場合、または空でない値が空文字列として書式設定された場合に、空で返されることがあります。 | |
| 書式設定された文字列は作成されませんでした。空文字列が VT_EMPTY に起因することを示します。 | |
| 割り当てに失敗したことを示します。 |
解説(Remarks)
IPropertySystem::FormatForDisplayAlloc を呼び出す前に、CoInitialize または OleInitialize でコンポーネントオブジェクトモデル (COM) を初期化する必要があります。
成功すると、このメソッドは指定した PROPERTYKEY と 1 つ以上の PROPDESC_FORMAT_FLAGS に対するプロパティ値の書式設定された Unicode 文字列表現を取得します。PROPERTYKEY がスキーマサブシステムで認識されない場合、IPropertySystem::FormatForDisplayAlloc はその VARTYPE に従って値を書式設定しようとします。
このメソッドはバッファーのメモリを割り当て、そのポインターを ppszDisplay に返します。呼び出し側アプリケーションは、ppszDisplay で指定された文字列が不要になったら、CoTaskMemFree を使用して解放する必要があります。
このメソッドの目的は、データをユーザーへの表示に適した文字列に変換することです。値は、現在のロケール、ユーザーの言語、PROPDESC_FORMAT_FLAGS、およびプロパティキーで指定されたプロパティの説明に従って書式設定されます。プロパティの説明スキーマが値の書式設定にどのように影響するかについては、displayInfo、stringFormat、booleanFormat、numberFormat、NMDATETIMEFORMAT、および enumeratedList を参照してください。通常、PROPDESC_FORMAT_FLAGS は、プロパティの説明で規定された書式を変更するために使用されます。
出力文字列には Unicode の方向制御文字が含まれる場合があります。これらの非スペーシング文字は Unicode 双方向アルゴリズムに影響を与え、左から右 (LTR) の言語が右から左 (RTL) のウィンドウ上に描画される場合(およびその逆の場合)に値が正しく表示されるようにします。これらの文字には次のものが含まれます: "\x200e", "\x200f", "\x202a", "\x202b", "\x202c", "\x202d", "\x202e".
次のプロパティは特殊な書式を使用し、PROPDESC_FORMAT_FLAGS の影響を受けません(記載されている例は、現在のロケールが英語に設定されている場合の文字列です。通常、特に記載のない限り出力はローカライズされます)。
| プロパティ | 書式 |
|---|---|
| System.FileAttributes | 次のファイル属性が文字に変換され、連結されて文字列が作成されます(たとえば、0x1801 (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_COMPRESSED | FILE_ATTRIBUTE_OFFLINE) という値は "RCO" に変換されます):
|
| System.Photo.ISOSpeed | たとえば "ISO-400"。 |
| System.Photo.ShutterSpeed |
APEX 値は、次の式を使用して露出時間に変換されます:
たとえば "2 sec." や "1/125 sec."。 |
| System.Photo.ExposureTime | たとえば "2 sec." や "1/125 sec." |
| System.Photo.Aperture |
APEX 値は、次の式を使用して F 値に変換されます:
たとえば "f/5.6"。 |
| System.Photo.FNumber | たとえば "f/5.6"。 |
| System.Photo.SubjectDistance | たとえば "15 m" や "250 mm"。 |
| System.Photo.FocalLength | たとえば "50 mm"。 |
| System.Photo.FlashEnergy | たとえば "500 bpcs"。 |
| System.Photo.ExposureBias | たとえば "-2 step"、" 0 step"、または "+3 step"。 |
| System.Computer.DecoratedFreeSpace | たとえば "105 MB free of 13.2 GB"。 |
| System.ItemType | たとえば "Application" や "JPEG Image"。 |
| System.ControlPanel.Category | たとえば "Appearance and Personalization"。 |
| System.ComputerName | たとえば "LITWARE05 (this computer)" や "testbox07"。 |
プロパティキーが登録済みのいずれのプロパティスキーマ内のプロパティの説明にも対応しない場合、このメソッドは値の型に基づいて書式を選択します。
| 値の型 | 書式 |
|---|---|
| VT_BOOLEAN | サポートされていません。 |
| VT_FILETIME | PROPDESC_FORMAT_FLAGS と現在のロケールで指定された日付/時刻文字列です。既定値は PDFF_SHORTTIME と PDFF_SHORTDATE です。たとえば "11/13/2006 3:22 PM"。 |
| 数値 VARTYPE | 現在のロケールでの 10 進文字列です。たとえば "42"。 |
| VT_LPWSTR またはその他 | 文字列に変換されます。"\r"、"\t"、または "\n" の並びは単一のスペースに置き換えられます。 |
| VT_VECTOR | 任意の型 | セミコロン区切りの値です。ロケールに関係なくセミコロンが使用されます。 |
プロパティの説明スキーマファイルの追加をスキーマサブシステムに通知します。(IPropertySystem.RegisterPropertySchema)
| pszPath | LPWSTR | in | ローカルマシン上の .propdesc ファイルへのファイルパスのポインターです。 |
戻り値
型: HRESULT
次のいずれかの値を返します。
| 戻り値コード | 説明 |
|---|---|
| スキーマが登録されたことを示します。 | |
| 呼び出し元のコンテキストに適切な特権がないことを示します。 | |
| スキーマ内の 1 つ以上のプロパティの説明が登録されなかったことを示します。 |
解説(Remarks)
このメソッドは、ローカルコンピューター上の .propdesc ファイルへのファイルパスを使用して、プロパティの説明スキーマ (.propdesc) ファイルの追加をスキーマサブシステムに通知します。このメソッドは、ファイルがコンピューターに最初にインストールされた後にのみ呼び出してください。通常、セットアップアプリケーションは .propdesc ファイルをインストールした後にこのメソッドを呼び出します。このファイルは、"Program Files" 配下のアプリケーションのインストールディレクトリに格納する必要があります。複数のスキーマファイルをまとめて登録するために、IPropertySystem::RegisterPropertySchema を複数回呼び出すことができます。
プロパティの説明の読み込みを妨げる失敗が発生した場合、その原因はアプリケーションのイベントログに記録されます。呼び出し元のコンテキストに、HKLM (HKEY_LOCAL_MACHINE) への書き込みアクセスを含む適切な特権がない場合、このメソッドは E_ACCESSDENIED で失敗します。特権を制限付きユーザーアカウント (LUA) の仕組みを通じて取得するのは、呼び出し側アプリケーションの責任です。
ローカルマシン上の .propdesc ファイルへのファイルパスを使用して、プロパティの説明スキーマ (.propdesc) ファイルの削除をスキーマサブシステムに通知します。
| pszPath | LPWSTR | in | ローカルマシン上の .propdesc ファイルへのファイルパスのポインターです。 |
戻り値
型: HRESULT
次のいずれかの値を返します。
| 戻り値コード | 説明 |
|---|---|
| スキーマの登録が解除されたことを示します。 | |
| 呼び出し元のコンテキストに適切な特権がないことを示します。 |
解説(Remarks)
このメソッドは、ファイルがマシンからアンインストールされるときに呼び出します。通常、セットアップアプリケーションは .propdesc ファイルのアンインストールの前後にこのメソッドを呼び出します。このメソッドは、ファイルが既に存在しなくなった後でも呼び出すことができます。
新しく登録解除されたスキーマファイルを検索インデックスおよびスキーマサブシステムのキャッシュから除外するには、IPropertySystem::RefreshPropertySchema を呼び出します。
呼び出し元のコンテキストに、ローカルマシンへの書き込みアクセスを含む適切な特権がない場合、このメソッドは E_ACCESSDENIED で失敗します。特権を最小特権ユーザーアカウント (LUA) の仕組みを通じて取得するのは、呼び出し元の責任です。
サポートされていません。(IPropertySystem.RefreshPropertySchema)
戻り値
型: HRESULT
次のいずれかの値を返します。
| 戻り値コード | 説明 |
|---|---|
| スキーマファイルが再読み込みされたことを示します。 | |
| 呼び出し元のコンテキストに適切な特権がないことを示します。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IPropertySystem "{CA724E8A-C3E6-442B-88A4-6FB0DB8035A3}" #usecom global IPropertySystem IID_IPropertySystem "{B8967F85-58AE-4F46-9FB2-5D7904798F4B}" #comfunc global IPropertySystem_GetPropertyDescription 3 var,var,sptr #comfunc global IPropertySystem_GetPropertyDescriptionByName 4 wstr,var,sptr #comfunc global IPropertySystem_GetPropertyDescriptionListFromString 5 wstr,var,sptr #comfunc global IPropertySystem_EnumeratePropertyDescriptions 6 int,var,sptr #comfunc global IPropertySystem_FormatForDisplay 7 var,var,int,var,int #comfunc global IPropertySystem_FormatForDisplayAlloc 8 var,var,int,var #comfunc global IPropertySystem_RegisterPropertySchema 9 wstr #comfunc global IPropertySystem_UnregisterPropertySchema 10 wstr #comfunc global IPropertySystem_RefreshPropertySchema 11 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IPropertySystem "{CA724E8A-C3E6-442B-88A4-6FB0DB8035A3}" #usecom global IPropertySystem IID_IPropertySystem "{B8967F85-58AE-4F46-9FB2-5D7904798F4B}" #comfunc global IPropertySystem_GetPropertyDescription 3 sptr,sptr,sptr #comfunc global IPropertySystem_GetPropertyDescriptionByName 4 wstr,sptr,sptr #comfunc global IPropertySystem_GetPropertyDescriptionListFromString 5 wstr,sptr,sptr #comfunc global IPropertySystem_EnumeratePropertyDescriptions 6 int,sptr,sptr #comfunc global IPropertySystem_FormatForDisplay 7 sptr,sptr,int,sptr,int #comfunc global IPropertySystem_FormatForDisplayAlloc 8 sptr,sptr,int,sptr #comfunc global IPropertySystem_RegisterPropertySchema 9 wstr #comfunc global IPropertySystem_UnregisterPropertySchema 10 wstr #comfunc global IPropertySystem_RefreshPropertySchema 11 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。