IShellFolder
COM公式ドキュメント
Shell の名前空間におけるすべてのフォルダーオブジェクトによって公開され、そのメソッドはフォルダーを管理するために使用されます。
解説(Remarks)
Shell の名前空間を拡張するオブジェクトには、このインターフェイスを実装します。たとえば、ルート化された Windows Explorer を必要とする独立した名前空間を作成する場合や、システム名前空間の階層内に新しい名前空間を直接インストールする場合に、このインターフェイスを実装します。自分の名前空間の内容を最もよく理解しているのは開発者自身であるため、データにアクセスするために必要なすべての処理を実装する責任は開発者にあります。
Shell の名前空間の内容を表示したり、その内容に対して操作を実行したりする必要がある場合に、このインターフェイスを使用します。IShellFolder をサポートするオブジェクトは、通常、他の Shell フォルダーオブジェクトによって作成されます。フォルダーの IShellFolder インターフェイスを取得するには、通常、まず SHGetDesktopFolder を呼び出します。この関数はデスクトップの IShellFolder インターフェイスへのポインターを返します。その後、そのメソッドを使用して、特定の名前空間フォルダーの IShellFolder インターフェイスを取得できます。
Examples
IShellFolder の実装例は、Explorer Data Provider Sample サンプルで確認できます。さまざまな IShellFolder メソッドの使用例は、File Operations Sample など、いくつかのサンプルで確認できます。メソッド 10
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ファイルオブジェクトまたはフォルダーの表示名を、アイテム識別子リストに変換します。
| hwnd | HWND | in | ウィンドウハンドル。クライアントがダイアログまたはメッセージボックスを表示する場合は、ウィンドウハンドルを指定する必要があります。それ以外の場合は、hwnd を NULL に設定します。 |
| pbc | IBindCtx* | in | 省略可能。解析関数への入力および出力としてパラメーターを渡すために使用するバインドコンテキストへのポインター。これらの渡されるパラメーターは、多くの場合データソースに固有であり、データソースの所有者によって文書化されています。たとえば、ファイルシステムのデータソースは、STR_FILE_SYS_BIND_DATA バインドコンテキストパラメーターを使用して、解析対象の名前を(WIN32_FIND_DATA 構造体として)受け付けます。STR_PARSE_PREFER_FOLDER_BROWSING を渡すと、可能な場合に URL をファイルシステムのデータソースを使用して解析するよう指示できます。バインドコンテキストオブジェクトは CreateBindCtx を使用して構築し、値は IBindCtx::RegisterObjectParam を使用して設定します。これらの完全な一覧については、Bind Context String Keys を参照してください。 解析関数に渡すデータや解析関数から受け取るデータがない場合、この値は NULL にできます。 |
| pszDisplayName | LPWSTR | in | 表示名を含む null 終端の Unicode 文字列。各 Shell フォルダーは独自の解析構文を定義するため、この文字列が取り得る形式はさまざまです。たとえばデスクトップフォルダーは、"C:\My Docs\My File.txt" のようなパスを受け付けます。また、"::{GUID}" 構文を使用して、GUID が関連付けられた名前空間内のアイテムへの参照も受け付けます。たとえば、デスクトップフォルダーからコントロールパネルの完全修飾識別子リストを取得するには、次のように使用できます。 |
| pchEaten | DWORD* | optional | 解析された表示名の文字数を受け取る ULONG 値へのポインター。アプリケーションがこの情報を必要としない場合は、pchEaten を NULL に設定します。この場合、値は返されません。 |
| ppidl | ITEMIDLIST** | out | このメソッドが返るとき、オブジェクトの PIDL へのポインターを格納します。返されるアイテム識別子リストは、解析対象のフォルダーからの相対的なアイテムを指定します。pszDisplayName に関連付けられたオブジェクトが解析対象のフォルダー内にある場合、返されるアイテム識別子リストには 1 つの SHITEMID 構造体のみが含まれます。オブジェクトが解析対象フォルダーのサブフォルダー内にある場合、返されるアイテム識別子リストには複数の SHITEMID 構造体が含まれます。エラーが発生した場合は、このアドレスに NULL が返されます。 このリソースが不要になったときに、CoTaskMemFree を呼び出して解放するのは呼び出し側の責任です。 |
| pdwAttributes | DWORD* | inout | ファイル属性を照会するために使用する値。使用しない場合は NULL に設定します。1 つ以上の属性を照会するには、対象となる属性を表す SFGAO フラグでこのパラメーターを初期化します。戻り時には、要求され、かつ true である属性が設定されます。 |
戻り値
型: HRESULT
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
一部の Shell フォルダーは IShellFolder::ParseDisplayName を実装していない場合があります。実装する各フォルダーは、独自の解析構文を定義します。
ParseDisplayName は、相対パスや親フォルダーの指示子("." や "..")を処理することは想定されていません。これらを適切に取り除くのは呼び出し側の責任です。
解析対象の名前を持つアイテムの存在を確認するために、pdwAttributes で SFGAO_VALIDATE フラグを使用しないでください。IShellFolder::ParseDisplayName は、特別なバインドコンテキストパラメーターによって動作が上書きされない限り、アイテムの存在を暗黙的に検証します。
一部の属性の照会は、比較的低速で、大量のメモリを使用する場合があります。たとえば、ファイルが共有されているかどうかを判定するために、Shell はネットワークコンポーネントを読み込みます。この処理には複数の DLL の読み込みが必要になる場合があります。pdwAttributes の目的は、照会を必要な情報のみに制限できるようにすることです。次のコード断片は、ファイルが圧縮されているかどうかを調べる方法を示しています。
LPITEMIDLIST pidl;
ULONG cbEaten;
DWORD dwAttribs = SFGAO_COMPRESSED;
hres = psf->ParseDisplayName(NULL,
NULL,
lpwszDisplayName,
&cbEaten, // This can be NULL
&pidl,
&dwAttribs);
if(dwAttribs & SFGAO_COMPRESSED)
{
// Do something with the compressed file
}
pdwAttributes は入出力パラメーターであるため、常に初期化する必要があります。初期化されていない値を渡すと、一部のビットが意図せず設定される可能性があります。その場合、IShellFolder::ParseDisplayName は対応する属性を照会するため、望ましくない遅延やメモリ需要を引き起こす可能性があります。属性を照会したくない場合は、予測できない動作を避けるために pdwAttributes を NULL に設定してください。
このメソッドは IParseDisplayName::ParseDisplayName メソッドに似ています。
アイテム識別子の列挙オブジェクトを作成し、その IEnumIDList インターフェイスを返すことで、クライアントがフォルダーの内容を確認できるようにします。そのインターフェイスがサポートするメソッドを使用して、フォルダーの内容を列挙できます。
| hwnd | HWND | in | 列挙を実行するためにユーザー入力が必要な場合、列挙オブジェクトはこのウィンドウハンドルをユーザー入力を受け取る親ウィンドウとして使用します。例としては、パスワードを求めるダイアログボックスや、CD またはフロッピーディスクの挿入をユーザーに促すダイアログボックスが挙げられます。hwndOwner が NULL に設定されている場合、列挙子はメッセージを表示してはならず、ユーザー入力が必要な場合は何も表示せずに失敗する必要があります。 |
| grfFlags | DWORD | in | 列挙に含めるアイテムを示すフラグ。指定可能な値の一覧については、SHCONTF 列挙型を参照してください。 |
| ppenumIDList | IEnumIDList** | out | このメソッドによって作成された列挙オブジェクトの IEnumIDList インターフェイスへのポインターを受け取るアドレス。エラーが発生した場合、または適切なサブオブジェクトが見つからない場合、ppenumIDList は NULL に設定されます。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合はエラー値を返します。実装によっては、渡された grfFlags に一致する子が存在しないことを示す S_FALSE を返す場合もあります。S_FALSE が返された場合、ppenumIDList は NULL に設定されます。
解説(Remarks)
メソッドが S_OK を返した場合、ppenumIDList は列挙子へのポインターを受け取ります。この場合、呼び出し側アプリケーションは、返された IEnumIDList オブジェクトの Release メソッドを呼び出して解放する必要があります。
メソッドが S_FALSE を返した場合、フォルダーには適切なサブオブジェクトが含まれておらず、ppenumIDList で指定されたポインターは NULL に設定されます。
メソッドが失敗した場合はエラー値が返され、ppenumIDList で指定されたポインターは NULL に設定されます。
フォルダーに適切なサブオブジェクトが含まれていない場合、IShellFolder::EnumObjects メソッドは、*ppenumIDList を NULL に設定して S_FALSE を返すか、オブジェクトを生成しない列挙子を *ppenumIDList に設定して S_OK を返すか、のいずれかが許容されます。呼び出し側アプリケーションは、両方の成功ケースに対応できるようにしておく必要があります。
ハンドラー、通常は特定のアイテムに対して IShellFolder を実装する Shell フォルダーオブジェクトを取得します。ハンドラーの構築を制御する省略可能なパラメーターは、バインドコンテキストで渡します。
| pidl | ITEMIDLIST* | in | サブフォルダーを識別する ITEMIDLIST 構造体(PIDL)のアドレス。この値は、名前空間階層内で親フォルダーより下の任意のレベルのアイテムを参照できます。この構造体には 1 つ以上の SHITEMID 構造体が含まれ、その後に終端の NULL が続きます。 |
| pbc | IBindCtx* | in | ハンドラーの構築にパラメーターを渡すために使用できる、バインドコンテキストオブジェクト上の IBindCtx インターフェイスへのポインター。このパラメーターを使用しない場合は NULL に設定します。このパラメーターのサポートはフォルダーオブジェクトの実装にとって省略可能であるため、一部のフォルダーはバインドコンテキストの使用をサポートしない場合があります。 バインドコンテキストで提供できる情報には、ストリームハンドラーへのバインド時のアクセスモードを示す grfMode メンバーを含む BIND_OPTS 構造体があります。その他のパラメーターは、IBindCtx::RegisterObjectParam および IBindCtx::GetObjectParam を使用して設定および取得できます。 |
| riid | GUID* | in | 返すインターフェイスの識別子。これは IID_IShellFolder、IID_IStream、または特定のハンドラーを識別するその他のインターフェイスにできます。 |
| ppv | void** | out | このメソッドが返るとき、要求されたインターフェイスへのポインターのアドレスを格納します。エラーが発生した場合、このアドレスに NULL ポインターが返されます。 |
戻り値
型: HRESULT
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
アプリケーションは、サブアイテムの Shell フォルダーオブジェクトを取得するために IShellFolder::BindToObject(..., IID_IShellFolder, ...) を使用します。クライアントは、特定のハンドラーを識別するために使用される正規のインターフェイス IID を渡す必要があります。たとえば、IID_IShellFolder はフォルダーハンドラーを、IID_IStream はストリームハンドラーを識別します。実装は、IID_IShellFolder2 のような派生インターフェイスを使用したハンドラーへのバインドをサポートすることもできます。Shell の名前空間拡張は、指定されたサブアイテムの Shell フォルダーオブジェクトを作成し、QueryInterface を呼び出してそのインターフェイスポインターを通じてオブジェクトと通信することで、この関数を実装できます。
BindToObject の実装は、サポートしていない IID 値に対して速やかに失敗することで、呼び出しを最適化できます。たとえば、サブアイテムの Shell フォルダーオブジェクトが IRemoteComputer をサポートしていない場合、実装は、サブアイテムの Shell フォルダーオブジェクトを不必要に作成した後で IRemoteComputer がサポートされていなかったと判明するのではなく、直ちに E_NOINTERFACE を返す必要があります。
オブジェクトのストレージインターフェイスへのポインターを要求します。
| pidl | ITEMIDLIST* | in | 親フォルダーからの相対的なサブフォルダーを識別する ITEMIDLIST 構造体のアドレス。この構造体には、ちょうど 1 つの SHITEMID 構造体が含まれ、その後に終端のゼロが続く必要があります。 |
| pbc | IBindCtx* | in | この操作中に使用するバインドコンテキストオブジェクト上の IBindCtx インターフェイスの省略可能なアドレス。このパラメーターを使用しない場合は NULL に設定します。pbc のサポートはフォルダーオブジェクトの実装にとって省略可能であるため、一部のフォルダーはバインドコンテキストの使用をサポートしない場合があります。 |
| riid | GUID* | in | 要求するストレージインターフェイスの IID。IStream、IStorage、または IPropertySetStorage インターフェイスポインターを取得するには、それぞれ riid を IID_IStream、IID_IStorage、または IID_IPropertySetStorage に設定します。 |
| ppv | void** | out | riid で指定されたインターフェイスポインターを受け取るアドレス。エラーが発生した場合、このアドレスに NULL ポインターが返されます。 |
戻り値
型: HRESULT
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
名前空間拡張は、アイテムのストレージを表すオブジェクトへのバインドをアプリケーションに許可するオプションを提供できます。このオプションがサポートされている場合、IShellFolder::BindToStorage は、オブジェクトの内容にアクセスするために使用できる指定されたインターフェイスポインターを返します。詳細については、IMoniker::BindToStorage のリファレンスを参照してください。
2 つのファイルオブジェクトまたはフォルダーの、そのアイテム識別子リストに基づく相対的な順序を決定します。
| lParam | LPARAM | in | 比較の実行方法を指定する値。 lParam の下位 16 ビットは並べ替えの規則を定義します。ほとんどのアプリケーションは、並べ替え規則を既定値のゼロに設定します。これは 2 つのアイテムを名前で比較することを示します。システムはこれ以外の並べ替え規則を定義していません。一部のフォルダーオブジェクトは、呼び出し側アプリケーションが lParam の下位 16 ビットを使用してフォルダー固有の並べ替え規則を指定することを許可する場合があります。これらの規則と、それに関連付けられた lParam の値は、フォルダーによって定義されます。 システムのフォルダービューオブジェクトが IShellFolder::CompareIDs を呼び出す場合、lParam の下位 16 ビットは比較に使用する列を指定するために使用されます。 lParam の上位 16 ビットは、並べ替え規則を変更するフラグに使用されます。システムは現在、次の修飾フラグを定義しています。 SHCIDS_ALLFIELDSバージョン 5.0。表示名だけでなく、ITEMIDLIST 構造体に含まれるすべての情報を比較します。このフラグは、IShellFolder2 インターフェイスをサポートするフォルダーオブジェクトに対してのみ有効です。たとえば、2 つのアイテムがファイルの場合、フォルダーはそれらの名前、サイズ、ファイル時刻、属性、および構造体内のその他の情報を比較する必要があります。このフラグが設定されている場合、lParam の下位 16 ビットはゼロである必要があります。 SHCIDS_CANONICALONLYバージョン 5.0。名前で比較する際に、表示名ではなくシステム名を比較します。このフラグが渡されると、2 つのアイテムは、一貫した並べ替え関数を実装している限り、Shell フォルダーが最も効率的と判断する任意の基準で比較されます。このフラグは、等価性を比較する場合や、並べ替えの結果がユーザーに表示されない場合に役立ちます。このフラグは他のフラグと組み合わせることはできません。 |
| pidl1 | ITEMIDLIST* | in | 1 番目のアイテムの ITEMIDLIST 構造体へのポインター。これはフォルダーからの相対的なものです。この ITEMIDLIST 構造体は複数の要素を含むことができるため、最初の要素だけでなく構造体全体を比較する必要があります。 |
| pidl2 | ITEMIDLIST* | in | 2 番目のアイテムの ITEMIDLIST 構造体へのポインター。これはフォルダーからの相対的なものです。この ITEMIDLIST 構造体は複数の要素を含むことができるため、最初の要素だけでなく構造体全体を比較する必要があります。 |
戻り値
型: HRESULT
このメソッドが成功すると、HRESULT の CODE フィールドに次のいずれかの値が含まれます。返された HRESULT からの CODE フィールドの抽出については、「解説」を参照してください。このメソッドが失敗すると、COM エラーコードを返します。
| 戻り値 | 説明 |
|---|---|
|
負の戻り値は、1 番目のアイテムが 2 番目のアイテムより前に並ぶべきであることを示します(pidl1 < pidl2)。 |
|
正の戻り値は、1 番目のアイテムが 2 番目のアイテムより後に並ぶべきであることを示します(pidl1 > pidl2)。 |
|
ゼロの戻り値は、2 つのアイテムが同一であることを示します(pidl1 = pidl2)。 |
解説(Remarks)
呼び出し側アプリケーションへの注意
フォルダーオブジェクトが IShellFolder2 をサポートしていない場合は、lParam に SHCIDS_ALLFIELDS フラグを設定しないでください。設定すると、予測できない結果になる可能性があります。SHCIDS_ALLFIELDS フラグを使用する場合、lParam の下位 16 ビットはゼロに設定する必要があります。HRESULT_CODE マクロを使用して HRESULT から CODE フィールドを抽出し、その結果を short にキャストします。
HRESULT hres = psf->CompareIDs(lParam, pidl1, pidl2);
if ((short)HRESULT_CODE(hres) < 0)
{ /* pidl1 comes first */ }
else if ((short)HRESULT_CODE(hres) > 0)
{ /* pidl2 comes first */ }
else
{ /* the two pidls are equal */ }
実装者への注意
並べ替え規則を抽出するには、ビット単位の AND 演算子(&)を使用して lParam と SHCIDS_COLUMNMASK(0X0000FFFF)を組み合わせます。この操作により、SHCIDS_ALLFIELDS 値を含む lParam の上位 16 ビットがマスクされます。MAKE_HRESULT マクロは、CompareIDs メソッドの実装で戻り値を構築するのに役立ちます。たとえば、次のようになります。
HRESULT CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
{
short sResult;
unsigned uSeverity = 0x000000000;
// Code that determines the relative order of pidl1 and pidl2 according to
// any sorting rules specified by lParam goes here.
//
// Set sResult = -1 if pidl1 precedes pidl2 (pidl1 < pidl2).
// Set sResult = 1 if pidl1 follows pidl2. (pidl1 > pidl2).
// Set sResult = 0 if pidl1 and pidl2 are equivalent in terms of ordering. (pidl1 = pidl2).
//
// Leave uSeverity = 0 if the order is successfully determined.
// Set uSeverity = 0x00000001 if there is an error.
return MAKE_HRESULT(uSeverity, 0, (unsigned short)sResult);
}
フォルダーオブジェクトから情報を取得したり、フォルダーオブジェクトと対話したりするために使用できるオブジェクトを要求します。
| hwndOwner | HWND | in | 所有者ウィンドウへのハンドル。カスタムのフォルダービューオブジェクトを実装している場合、フォルダービューウィンドウは hwndOwner の子として作成する必要があります。 |
| riid | GUID* | in | ppv を通じて取得するインターフェイスの IID への参照。通常は IID_IShellView です。 |
| ppv | void** | out | このメソッドが正常に返るとき、riid で要求されたインターフェイスポインターを格納します。通常は IShellView です。詳細については「解説」を参照してください。 |
戻り値
型: HRESULT
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
この要求をサポートするには、riid で示されるインターフェイスを公開するオブジェクトを作成し、そのインターフェイスへのポインターを返します。
このメソッドの主な目的は、フォルダーオブジェクトのフォルダービューオブジェクトを Windows Explorer に提供することです。Windows Explorer は、riid を IID_IShellView に設定してフォルダービューオブジェクトを要求します。フォルダービューオブジェクトは、Windows Explorer のフォルダービューにフォルダーの内容を表示します。Windows Explorer は複数のフォルダービューオブジェクトを作成するためにこのメソッドを複数回呼び出す可能性があるため、フォルダービューオブジェクトは Shell フォルダーオブジェクトから独立している必要があります。このメソッドが呼び出されるたびに、新しいビューオブジェクトを作成する必要があります。フォルダーオブジェクトは、この要求に対して次の 2 つの方法のいずれかで応答できます。
- カスタムのフォルダービューオブジェクトを作成し、その IShellView インターフェイスへのポインターを返す。
- システムのフォルダービューオブジェクトを作成し、その IShellView インターフェイスへのポインターを返す。
IShellFolder が表すオブジェクトに含まれる 1 つ以上のファイルオブジェクトまたはフォルダーオブジェクトの属性を取得します。
| cidl | DWORD | in | 属性を取得するアイテムの数。 |
| apidl | ITEMIDLIST** | in | ITEMIDLIST 構造体へのポインターの配列のアドレス。各構造体は、親フォルダーからの相対的なアイテムを一意に識別します。各 ITEMIDLIST 構造体は、ちょうど 1 つの SHITEMID 構造体を含み、その後に終端のゼロが続く必要があります。 |
| rgfInOut | DWORD* | inout | 単一の ULONG 値へのポインター。入力時には、呼び出し側アプリケーションが要求するビット単位の SFGAO 属性を含みます。戻り時には、指定されたすべてのアイテムに共通する、要求された属性を含みます。 |
戻り値
型: HRESULT
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
この操作を最適化するために、指定されていないフラグは返さないでください。
フォルダーオブジェクトの場合、SFGAO_BROWSABLE 属性は、クライアントがここに一般的な形式で示すようにこのオブジェクトにバインドできることを意味します。
IShellFolder::BindToObject(..., pidl, IID_IShellFolder, &psfItem);
その後、クライアントは次のステートメントを通じて、そのアイテム上に IShellView を作成できます。
psfItem->CreateViewObject(..., IID_IShellView,...);
SFGAO_DROPTARGET 属性は、クライアントがここに示すように IShellFolder::GetUIObjectOf を呼び出すことで、このフォルダーに対する IDropTarget のインスタンスにバインドできることを意味します。
IShellFolder::GetUIObjectOf(hwnd, 1, &pidl, IID_IDropTarget, NULL, &pv)
SFGAO_NONENUMERATED 属性は、IShellFolder::EnumObjects メソッドによって作成された列挙子が返さないアイテムを示します。
指定されたファイルオブジェクトまたはフォルダーに対してアクションを実行するために使用できるオブジェクトを取得します。
| hwndOwner | HWND | in | クライアントがダイアログボックスまたはメッセージボックスを表示する場合に指定する、所有者ウィンドウへのハンドル。 |
| cidl | DWORD | in | apidl パラメーターで指定されたファイルオブジェクトまたはサブフォルダーの数。 |
| apidl | ITEMIDLIST** | in | ITEMIDLIST 構造体へのポインターの配列のアドレス。各構造体は、親フォルダーからの相対的なファイルオブジェクトまたはサブフォルダーを一意に識別します。各アイテム識別子リストは、ちょうど 1 つの SHITEMID 構造体を含み、その後に終端のゼロが続く必要があります。 |
| riid | GUID* | in | ppv を通じて取得するインターフェイスの IID への参照。これは、アイテムに対して作成できる任意の有効なインターフェイス識別子にできます。Shell が使用する最も一般的な識別子は、このリファレンスの末尾のコメントに記載されています。 |
| rgfReserved | DWORD* | optional | 予約済み。 |
| ppv | void** | out | このメソッドが正常に返るとき、riid で要求されたインターフェイスポインターを格納します。 |
戻り値
型: HRESULT
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
cidl が 1 より大きい場合、IShellFolder::GetUIObjectOf の実装は、apidl で指定されたすべてのアイテムに対して 1 つのオブジェクトを作成できる場合にのみ成功する必要があります。すべてのアイテムに対して 1 つのオブジェクトを作成できない場合、このメソッドは失敗します。
次に、Shell がこのメソッドからインターフェイスを要求する際に使用する最も一般的なインターフェイス識別子を示します。この一覧は、要求されたインターフェイスに対して cidl が 1 より大きくできるかどうかも示しています。
| インターフェイス識別子 | 許容される cidl 値 |
|---|---|
| IContextMenu | cidl パラメーターは 1 以上にできます。 |
| IContextMenu2 | cidl パラメーターは 1 以上にできます。 |
| IDataObject | cidl パラメーターは 1 以上にできます。 |
| IDropTarget | cidl パラメーターは 1 のみです。 |
| IExtractIcon | cidl パラメーターは 1 のみです。 |
| IExtractImage | cidl パラメーターは 1 のみです。 |
| IQueryInfo | cidl パラメーターは 1 のみです。 |
riid と ppv のパラメーターをまとめるには、Objbase.h で定義されている IID_PPV_ARGS マクロを使用することをお勧めします。このマクロは、ppv の値が指すインターフェイスに基づいて正しい IID を提供するため、予期しない結果につながる riid のコーディングミスの可能性を排除できます。
指定されたファイルオブジェクトまたはサブフォルダーの表示名を取得します。
| pidl | ITEMIDLIST* | in | 親フォルダーからの相対的なファイルオブジェクトまたはサブフォルダーを一意に識別する PIDL。 |
| uFlags | SHGDNF | in | 返す表示名の種類を要求するために使用するフラグ。指定可能な値の一覧については、SHGDNF 列挙型を参照してください。 |
| pName | STRRET* | out | このメソッドが返るとき、表示名を返す STRRET 構造体へのポインターを格納します。この構造体で返される名前の種類は要求された種類になることもありますが、Shell フォルダーが別の種類を返す場合もあります。 |
戻り値
型: HRESULT
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
この関数によって割り当てられたリソースを解放するのは呼び出し側の責任です。
通常、pidl は親フォルダーに含まれるアイテムのみを参照できます。PIDL は単一レベルで、ちょうど 1 つの SHITEMID 構造体を含み、その後に終端のゼロが続く必要があります。親フォルダーから 1 レベルより深いアイテムの表示名を取得したい場合は、SHBindToParent を使用してアイテムの直接の親フォルダーにバインドし、そのアイテムの単一レベル PIDL を IShellFolder::GetDisplayNameOf に渡します。
また、uFlags に SHGDN_FORPARSING フラグが設定され、SHGDN_INFOLDER フラグが設定されていない場合、pidl は名前空間階層内で親フォルダーより下の任意のレベルのオブジェクトを参照できます。かつては、pidl は親フォルダーからの相対的な複数レベルの PIDL で、複数の SHITEMID 構造体を含むことができました。しかし、これはもうサポートされておらず、pidl は現在では単一の子アイテムのみを参照する必要があります。
pName が指す構造体から表示名を取得する最も簡単な方法は、それを StrRetToBuf または StrRetToStr のいずれかに渡すことです。これらの関数は STRRET 構造体を受け取り、名前を返します。構造体の uType メンバーを調べて、適切なメンバーから名前を取得することもできます。
uFlags で指定されたフラグは、名前の意図された用途に関するヒントです。これらは、IShellFolder が要求された形式の名前を返すことを保証するものではありません。その形式が利用できない場合は、別の形式が返される可能性があります。特に、SHGDN_FORPARSING フラグによって返される名前が IShellFolder::ParseDisplayName によって正常に解析される保証はありません。また、フラグの組み合わせによっては、GetDisplayNameOf/ParseDisplayName の往復で元の識別子リストが返されない場合があります。これは例外的な事象ですが、念のため確認する必要があります。
ファイルオブジェクトまたはサブフォルダーの表示名を設定し、その過程でアイテム識別子を変更します。
| hwnd | HWND | inoptional | クライアントが表示するダイアログまたはメッセージボックスの所有者ウィンドウへのハンドル。 |
| pidl | ITEMIDLIST* | in | 親フォルダーからの相対的なファイルオブジェクトまたはサブフォルダーを一意に識別する ITEMIDLIST 構造体へのポインター。この構造体は、ちょうど 1 つの SHITEMID 構造体を含み、その後に終端のゼロが続く必要があります。 |
| pszName | LPWSTR | in | 新しい表示名を指定する null 終端文字列へのポインター。 |
| uFlags | SHGDNF | in | pszName パラメーターで指定された名前の種類を示すフラグ。指定可能な値と値の組み合わせの一覧については、SHGDNF を参照してください。 |
| ppidlOut | ITEMIDLIST** | outoptional | 省略可能。指定する場合、名前が変更されたアイテムの ITEMIDLIST を受け取る ITEMIDLIST 構造体へのポインターのアドレス。呼び出し側は、null 以外の ppidlOut を渡すことでこの値を要求します。IShellFolder::SetNameOf の実装は、ppidlOut パラメーターに新しい ITEMIDLIST へのポインターを返す必要があります。 |
戻り値
型: HRESULT
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
ファイルシステムオブジェクトやその中のフォルダーの表示名を変更すると、そのファイルまたはディレクトリの名前が変更されます。
このメソッドを呼び出す前に、アプリケーションは IShellFolder::GetAttributesOf を呼び出し、SFGAO_CANRENAME フラグが設定されていることを確認する必要があります。このフラグは本質的に名前空間クライアントへのヒントである点に注意してください。これは IShellFolder::SetNameOf が成功する、または失敗することを必ずしも意味するものではありません。
IShellFolder::SetNameOf の実装者は、オブジェクトの名前変更が完了したら、変更前と変更後の両方の絶対 PIDL を指定して SHChangeNotify を呼び出す必要があります。次の例は、フォルダーオブジェクトの名前変更に続く SHChangeNotify の呼び出しを示しています。
SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_IDLIST, pidlFullOld, pidlFullNew);
この呼び出しにより、ビューに変更前と変更後の両方の名前が表示されるのを防ぎます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IShellFolder "{000214E6-0000-0000-C000-000000000046}" #usecom global IShellFolder IID_IShellFolder "{}" #comfunc global IShellFolder_ParseDisplayName 3 sptr,sptr,wstr,var,var,var #comfunc global IShellFolder_EnumObjects 4 sptr,int,sptr #comfunc global IShellFolder_BindToObject 5 var,sptr,var,sptr #comfunc global IShellFolder_BindToStorage 6 var,sptr,var,sptr #comfunc global IShellFolder_CompareIDs 7 sptr,var,var #comfunc global IShellFolder_CreateViewObject 8 sptr,var,sptr #comfunc global IShellFolder_GetAttributesOf 9 int,var,var #comfunc global IShellFolder_GetUIObjectOf 10 sptr,int,var,var,var,sptr #comfunc global IShellFolder_GetDisplayNameOf 11 var,int,var #comfunc global IShellFolder_SetNameOf 12 sptr,var,wstr,int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IShellFolder "{000214E6-0000-0000-C000-000000000046}" #usecom global IShellFolder IID_IShellFolder "{}" #comfunc global IShellFolder_ParseDisplayName 3 sptr,sptr,wstr,sptr,sptr,sptr #comfunc global IShellFolder_EnumObjects 4 sptr,int,sptr #comfunc global IShellFolder_BindToObject 5 sptr,sptr,sptr,sptr #comfunc global IShellFolder_BindToStorage 6 sptr,sptr,sptr,sptr #comfunc global IShellFolder_CompareIDs 7 sptr,sptr,sptr #comfunc global IShellFolder_CreateViewObject 8 sptr,sptr,sptr #comfunc global IShellFolder_GetAttributesOf 9 int,sptr,sptr #comfunc global IShellFolder_GetUIObjectOf 10 sptr,int,sptr,sptr,sptr,sptr #comfunc global IShellFolder_GetDisplayNameOf 11 sptr,int,sptr #comfunc global IShellFolder_SetNameOf 12 sptr,sptr,wstr,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。