Win32 API 日本語リファレンス
ホームUI.Shell › IShellFolder

IShellFolder

COM
IID000214e6-0000-0000-c000-000000000046継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

Shell の名前空間におけるすべてのフォルダーオブジェクトによって公開され、そのメソッドはフォルダーを管理するために使用されます。

解説(Remarks)

Shell の名前空間を拡張するオブジェクトには、このインターフェイスを実装します。たとえば、ルート化された Windows Explorer を必要とする独立した名前空間を作成する場合や、システム名前空間の階層内に新しい名前空間を直接インストールする場合に、このインターフェイスを実装します。自分の名前空間の内容を最もよく理解しているのは開発者自身であるため、データにアクセスするために必要なすべての処理を実装する責任は開発者にあります。

Shell の名前空間の内容を表示したり、その内容に対して操作を実行したりする必要がある場合に、このインターフェイスを使用します。IShellFolder をサポートするオブジェクトは、通常、他の Shell フォルダーオブジェクトによって作成されます。フォルダーの IShellFolder インターフェイスを取得するには、通常、まず SHGetDesktopFolder を呼び出します。この関数はデスクトップの IShellFolder インターフェイスへのポインターを返します。その後、そのメソッドを使用して、特定の名前空間フォルダーの IShellFolder インターフェイスを取得できます。

Note IShellFolder のメソッドは、フォルダーからの相対的な PIDL のみを受け付けます。IShellFolder::GetAttributesOf など、一部の IShellFolder メソッドは、単一レベルの PIDL のみを受け付けます。言い換えると、PIDL は単一の SHITEMID 構造体と、その終端の NULL のみを含む必要があります。IEnumIDList を使用してフォルダーの内容を列挙すると、この形式の PIDL を受け取ります。IShellFolder::CompareIDs などの他のメソッドは、複数レベルの PIDL を受け付けます。これらの PIDL は複数の SHITEMID 構造体を含むことができ、親フォルダーより 1 レベル以上下のオブジェクトを識別します。特定のメソッドがどの種類の PIDL を受け付けられるかは、リファレンスで確認してください。

Examples

IShellFolder の実装例は、Explorer Data Provider Sample サンプルで確認できます。さまざまな IShellFolder メソッドの使用例は、File Operations Sample など、いくつかのサンプルで確認できます。

メソッド 10

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT ParseDisplayName(HWND hwnd, IBindCtx* pbc, LPWSTR pszDisplayName, DWORD* pchEaten, ITEMIDLIST** ppidl, DWORD* pdwAttributes)

ファイルオブジェクトまたはフォルダーの表示名を、アイテム識別子リストに変換します。

hwndHWNDinウィンドウハンドル。クライアントがダイアログまたはメッセージボックスを表示する場合は、ウィンドウハンドルを指定する必要があります。それ以外の場合は、hwndNULL に設定します。
pbcIBindCtx*in

省略可能。解析関数への入力および出力としてパラメーターを渡すために使用するバインドコンテキストへのポインター。これらの渡されるパラメーターは、多くの場合データソースに固有であり、データソースの所有者によって文書化されています。たとえば、ファイルシステムのデータソースは、STR_FILE_SYS_BIND_DATA バインドコンテキストパラメーターを使用して、解析対象の名前を(WIN32_FIND_DATA 構造体として)受け付けます。STR_PARSE_PREFER_FOLDER_BROWSING を渡すと、可能な場合に URL をファイルシステムのデータソースを使用して解析するよう指示できます。バインドコンテキストオブジェクトは CreateBindCtx を使用して構築し、値は IBindCtx::RegisterObjectParam を使用して設定します。これらの完全な一覧については、Bind Context String Keys を参照してください。

解析関数に渡すデータや解析関数から受け取るデータがない場合、この値は NULL にできます。

pszDisplayNameLPWSTRin

表示名を含む null 終端の Unicode 文字列。各 Shell フォルダーは独自の解析構文を定義するため、この文字列が取り得る形式はさまざまです。たとえばデスクトップフォルダーは、"C:\My Docs\My File.txt" のようなパスを受け付けます。また、"::{GUID}" 構文を使用して、GUID が関連付けられた名前空間内のアイテムへの参照も受け付けます。たとえば、デスクトップフォルダーからコントロールパネルの完全修飾識別子リストを取得するには、次のように使用できます。

::{CLSID for Control Panel}\::{CLSID for printers folder}
pchEatenDWORD*optional解析された表示名の文字数を受け取る ULONG 値へのポインター。アプリケーションがこの情報を必要としない場合は、pchEatenNULL に設定します。この場合、値は返されません。
ppidlITEMIDLIST**out

このメソッドが返るとき、オブジェクトの PIDL へのポインターを格納します。返されるアイテム識別子リストは、解析対象のフォルダーからの相対的なアイテムを指定します。pszDisplayName に関連付けられたオブジェクトが解析対象のフォルダー内にある場合、返されるアイテム識別子リストには 1 つの SHITEMID 構造体のみが含まれます。オブジェクトが解析対象フォルダーのサブフォルダー内にある場合、返されるアイテム識別子リストには複数の SHITEMID 構造体が含まれます。エラーが発生した場合は、このアドレスに NULL が返されます。

このリソースが不要になったときに、CoTaskMemFree を呼び出して解放するのは呼び出し側の責任です。

pdwAttributesDWORD*inoutファイル属性を照会するために使用する値。使用しない場合は NULL に設定します。1 つ以上の属性を照会するには、対象となる属性を表す SFGAO フラグでこのパラメーターを初期化します。戻り時には、要求され、かつ true である属性が設定されます。

戻り値

型: HRESULT

このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。

解説(Remarks)

一部の Shell フォルダーは IShellFolder::ParseDisplayName を実装していない場合があります。実装する各フォルダーは、独自の解析構文を定義します。

ParseDisplayName は、相対パスや親フォルダーの指示子("." や "..")を処理することは想定されていません。これらを適切に取り除くのは呼び出し側の責任です。

解析対象の名前を持つアイテムの存在を確認するために、pdwAttributesSFGAO_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 は対応する属性を照会するため、望ましくない遅延やメモリ需要を引き起こす可能性があります。属性を照会したくない場合は、予測できない動作を避けるために pdwAttributesNULL に設定してください。

このメソッドは IParseDisplayName::ParseDisplayName メソッドに似ています。

vtbl 4 HRESULT EnumObjects(HWND hwnd, DWORD grfFlags, IEnumIDList** ppenumIDList)

アイテム識別子の列挙オブジェクトを作成し、その IEnumIDList インターフェイスを返すことで、クライアントがフォルダーの内容を確認できるようにします。そのインターフェイスがサポートするメソッドを使用して、フォルダーの内容を列挙できます。

hwndHWNDin列挙を実行するためにユーザー入力が必要な場合、列挙オブジェクトはこのウィンドウハンドルをユーザー入力を受け取る親ウィンドウとして使用します。例としては、パスワードを求めるダイアログボックスや、CD またはフロッピーディスクの挿入をユーザーに促すダイアログボックスが挙げられます。hwndOwnerNULL に設定されている場合、列挙子はメッセージを表示してはならず、ユーザー入力が必要な場合は何も表示せずに失敗する必要があります。
grfFlagsDWORDin列挙に含めるアイテムを示すフラグ。指定可能な値の一覧については、SHCONTF 列挙型を参照してください。
ppenumIDListIEnumIDList**outこのメソッドによって作成された列挙オブジェクトの IEnumIDList インターフェイスへのポインターを受け取るアドレス。エラーが発生した場合、または適切なサブオブジェクトが見つからない場合、ppenumIDListNULL に設定されます。

戻り値

型: HRESULT

成功した場合は S_OK を返し、それ以外の場合はエラー値を返します。実装によっては、渡された grfFlags に一致する子が存在しないことを示す S_FALSE を返す場合もあります。S_FALSE が返された場合、ppenumIDListNULL に設定されます。

解説(Remarks)

メソッドが S_OK を返した場合、ppenumIDList は列挙子へのポインターを受け取ります。この場合、呼び出し側アプリケーションは、返された IEnumIDList オブジェクトの Release メソッドを呼び出して解放する必要があります。

メソッドが S_FALSE を返した場合、フォルダーには適切なサブオブジェクトが含まれておらず、ppenumIDList で指定されたポインターは NULL に設定されます。

メソッドが失敗した場合はエラー値が返され、ppenumIDList で指定されたポインターは NULL に設定されます。

フォルダーに適切なサブオブジェクトが含まれていない場合、IShellFolder::EnumObjects メソッドは、*ppenumIDListNULL に設定して S_FALSE を返すか、オブジェクトを生成しない列挙子を *ppenumIDList に設定して S_OK を返すか、のいずれかが許容されます。呼び出し側アプリケーションは、両方の成功ケースに対応できるようにしておく必要があります。

vtbl 5 HRESULT BindToObject(ITEMIDLIST* pidl, IBindCtx* pbc, GUID* riid, void** ppv)

ハンドラー、通常は特定のアイテムに対して IShellFolder を実装する Shell フォルダーオブジェクトを取得します。ハンドラーの構築を制御する省略可能なパラメーターは、バインドコンテキストで渡します。

pidlITEMIDLIST*inサブフォルダーを識別する ITEMIDLIST 構造体(PIDL)のアドレス。この値は、名前空間階層内で親フォルダーより下の任意のレベルのアイテムを参照できます。この構造体には 1 つ以上の SHITEMID 構造体が含まれ、その後に終端の NULL が続きます。
pbcIBindCtx*in

ハンドラーの構築にパラメーターを渡すために使用できる、バインドコンテキストオブジェクト上の IBindCtx インターフェイスへのポインター。このパラメーターを使用しない場合は NULL に設定します。このパラメーターのサポートはフォルダーオブジェクトの実装にとって省略可能であるため、一部のフォルダーはバインドコンテキストの使用をサポートしない場合があります。

バインドコンテキストで提供できる情報には、ストリームハンドラーへのバインド時のアクセスモードを示す grfMode メンバーを含む BIND_OPTS 構造体があります。その他のパラメーターは、IBindCtx::RegisterObjectParam および IBindCtx::GetObjectParam を使用して設定および取得できます。

riidGUID*in返すインターフェイスの識別子。これは IID_IShellFolderIID_IStream、または特定のハンドラーを識別するその他のインターフェイスにできます。
ppvvoid**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 を返す必要があります。

vtbl 6 HRESULT BindToStorage(ITEMIDLIST* pidl, IBindCtx* pbc, GUID* riid, void** ppv)

オブジェクトのストレージインターフェイスへのポインターを要求します。

pidlITEMIDLIST*in親フォルダーからの相対的なサブフォルダーを識別する ITEMIDLIST 構造体のアドレス。この構造体には、ちょうど 1 つの SHITEMID 構造体が含まれ、その後に終端のゼロが続く必要があります。
pbcIBindCtx*inこの操作中に使用するバインドコンテキストオブジェクト上の IBindCtx インターフェイスの省略可能なアドレス。このパラメーターを使用しない場合は NULL に設定します。pbc のサポートはフォルダーオブジェクトの実装にとって省略可能であるため、一部のフォルダーはバインドコンテキストの使用をサポートしない場合があります。
riidGUID*in要求するストレージインターフェイスの IID。IStreamIStorage、または IPropertySetStorage インターフェイスポインターを取得するには、それぞれ riidIID_IStreamIID_IStorage、または IID_IPropertySetStorage に設定します。
ppvvoid**outriid で指定されたインターフェイスポインターを受け取るアドレス。エラーが発生した場合、このアドレスに NULL ポインターが返されます。

戻り値

型: HRESULT

このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。

解説(Remarks)

名前空間拡張は、アイテムのストレージを表すオブジェクトへのバインドをアプリケーションに許可するオプションを提供できます。このオプションがサポートされている場合、IShellFolder::BindToStorage は、オブジェクトの内容にアクセスするために使用できる指定されたインターフェイスポインターを返します。詳細については、IMoniker::BindToStorage のリファレンスを参照してください。

vtbl 7 HRESULT CompareIDs(LPARAM lParam, ITEMIDLIST* pidl1, ITEMIDLIST* pidl2)

2 つのファイルオブジェクトまたはフォルダーの、そのアイテム識別子リストに基づく相対的な順序を決定します。

lParamLPARAMin

比較の実行方法を指定する値。

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 フォルダーが最も効率的と判断する任意の基準で比較されます。このフラグは、等価性を比較する場合や、並べ替えの結果がユーザーに表示されない場合に役立ちます。このフラグは他のフラグと組み合わせることはできません。

pidl1ITEMIDLIST*in1 番目のアイテムの ITEMIDLIST 構造体へのポインター。これはフォルダーからの相対的なものです。この ITEMIDLIST 構造体は複数の要素を含むことができるため、最初の要素だけでなく構造体全体を比較する必要があります。
pidl2ITEMIDLIST*in2 番目のアイテムの ITEMIDLIST 構造体へのポインター。これはフォルダーからの相対的なものです。この ITEMIDLIST 構造体は複数の要素を含むことができるため、最初の要素だけでなく構造体全体を比較する必要があります。

戻り値

型: HRESULT

このメソッドが成功すると、HRESULT の CODE フィールドに次のいずれかの値が含まれます。返された HRESULT からの CODE フィールドの抽出については、「解説」を参照してください。このメソッドが失敗すると、COM エラーコードを返します。

戻り値 説明
負の値
負の戻り値は、1 番目のアイテムが 2 番目のアイテムより前に並ぶべきであることを示します(pidl1 < pidl2)。
正の値
正の戻り値は、1 番目のアイテムが 2 番目のアイテムより後に並ぶべきであることを示します(pidl1 > pidl2)。
ゼロ
ゼロの戻り値は、2 つのアイテムが同一であることを示します(pidl1 = pidl2)。

解説(Remarks)

呼び出し側アプリケーションへの注意

フォルダーオブジェクトが IShellFolder2 をサポートしていない場合は、lParamSHCIDS_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 演算子(&)を使用して lParamSHCIDS_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);
}
vtbl 8 HRESULT CreateViewObject(HWND hwndOwner, GUID* riid, void** ppv)

フォルダーオブジェクトから情報を取得したり、フォルダーオブジェクトと対話したりするために使用できるオブジェクトを要求します。

hwndOwnerHWNDin所有者ウィンドウへのハンドル。カスタムのフォルダービューオブジェクトを実装している場合、フォルダービューウィンドウは hwndOwner の子として作成する必要があります。
riidGUID*inppv を通じて取得するインターフェイスの IID への参照。通常は IID_IShellView です。
ppvvoid**outこのメソッドが正常に返るとき、riid で要求されたインターフェイスポインターを格納します。通常は IShellView です。詳細については「解説」を参照してください。

戻り値

型: HRESULT

このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。

解説(Remarks)

この要求をサポートするには、riid で示されるインターフェイスを公開するオブジェクトを作成し、そのインターフェイスへのポインターを返します。

このメソッドの主な目的は、フォルダーオブジェクトのフォルダービューオブジェクトを Windows Explorer に提供することです。Windows Explorer は、riid を IID_IShellView に設定してフォルダービューオブジェクトを要求します。フォルダービューオブジェクトは、Windows Explorer のフォルダービューにフォルダーの内容を表示します。Windows Explorer は複数のフォルダービューオブジェクトを作成するためにこのメソッドを複数回呼び出す可能性があるため、フォルダービューオブジェクトは Shell フォルダーオブジェクトから独立している必要があります。このメソッドが呼び出されるたびに、新しいビューオブジェクトを作成する必要があります。フォルダーオブジェクトは、この要求に対して次の 2 つの方法のいずれかで応答できます。

このメソッドは、IContextMenuIExtractIcon を含む、いくつかの省略可能なインターフェイスのいずれかを公開するオブジェクトを要求するためにも使用されます。この文脈では、CreateViewObjectIShellFolder::GetUIObjectOf と使用方法が似ています。ただし、IShellFolder::GetUIObjectOf はフォルダーに含まれるアイテムの 1 つに対するオブジェクトを要求するために呼び出します。IShellFolder::CreateViewObject はフォルダー自体に対するオブジェクトを要求するために呼び出します。最もよく要求されるインターフェイスは次のとおりです。 riidppv のパラメーターをまとめるには、Objbase.h で定義されている IID_PPV_ARGS マクロを使用することをお勧めします。このマクロは、ppv の値が指すインターフェイスに基づいて正しい IID を提供するため、予期しない結果につながる riid のコーディングミスの可能性を排除できます。
vtbl 9 HRESULT GetAttributesOf(DWORD cidl, ITEMIDLIST** apidl, DWORD* rgfInOut)

IShellFolder が表すオブジェクトに含まれる 1 つ以上のファイルオブジェクトまたはフォルダーオブジェクトの属性を取得します。

cidlDWORDin属性を取得するアイテムの数。
apidlITEMIDLIST**inITEMIDLIST 構造体へのポインターの配列のアドレス。各構造体は、親フォルダーからの相対的なアイテムを一意に識別します。各 ITEMIDLIST 構造体は、ちょうど 1 つの SHITEMID 構造体を含み、その後に終端のゼロが続く必要があります。
rgfInOutDWORD*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 メソッドによって作成された列挙子が返さないアイテムを示します。

vtbl 10 HRESULT GetUIObjectOf(HWND hwndOwner, DWORD cidl, ITEMIDLIST** apidl, GUID* riid, DWORD* rgfReserved, void** ppv)

指定されたファイルオブジェクトまたはフォルダーに対してアクションを実行するために使用できるオブジェクトを取得します。

hwndOwnerHWNDinクライアントがダイアログボックスまたはメッセージボックスを表示する場合に指定する、所有者ウィンドウへのハンドル。
cidlDWORDinapidl パラメーターで指定されたファイルオブジェクトまたはサブフォルダーの数。
apidlITEMIDLIST**inITEMIDLIST 構造体へのポインターの配列のアドレス。各構造体は、親フォルダーからの相対的なファイルオブジェクトまたはサブフォルダーを一意に識別します。各アイテム識別子リストは、ちょうど 1 つの SHITEMID 構造体を含み、その後に終端のゼロが続く必要があります。
riidGUID*inppv を通じて取得するインターフェイスの IID への参照。これは、アイテムに対して作成できる任意の有効なインターフェイス識別子にできます。Shell が使用する最も一般的な識別子は、このリファレンスの末尾のコメントに記載されています。
rgfReservedDWORD*optional予約済み。
ppvvoid**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 のみです。

riidppv のパラメーターをまとめるには、Objbase.h で定義されている IID_PPV_ARGS マクロを使用することをお勧めします。このマクロは、ppv の値が指すインターフェイスに基づいて正しい IID を提供するため、予期しない結果につながる riid のコーディングミスの可能性を排除できます。

vtbl 11 HRESULT GetDisplayNameOf(ITEMIDLIST* pidl, SHGDNF uFlags, STRRET* pName)

指定されたファイルオブジェクトまたはサブフォルダーの表示名を取得します。

pidlITEMIDLIST*in親フォルダーからの相対的なファイルオブジェクトまたはサブフォルダーを一意に識別する PIDL。
uFlagsSHGDNFin返す表示名の種類を要求するために使用するフラグ。指定可能な値の一覧については、SHGDNF 列挙型を参照してください。
pNameSTRRET*outこのメソッドが返るとき、表示名を返す STRRET 構造体へのポインターを格納します。この構造体で返される名前の種類は要求された種類になることもありますが、Shell フォルダーが別の種類を返す場合もあります。

戻り値

型: HRESULT

このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。

解説(Remarks)

この関数によって割り当てられたリソースを解放するのは呼び出し側の責任です。

通常、pidl は親フォルダーに含まれるアイテムのみを参照できます。PIDL は単一レベルで、ちょうど 1 つの SHITEMID 構造体を含み、その後に終端のゼロが続く必要があります。親フォルダーから 1 レベルより深いアイテムの表示名を取得したい場合は、SHBindToParent を使用してアイテムの直接の親フォルダーにバインドし、そのアイテムの単一レベル PIDL を IShellFolder::GetDisplayNameOf に渡します。

また、uFlagsSHGDN_FORPARSING フラグが設定され、SHGDN_INFOLDER フラグが設定されていない場合、pidl は名前空間階層内で親フォルダーより下の任意のレベルのオブジェクトを参照できます。かつては、pidl は親フォルダーからの相対的な複数レベルの PIDL で、複数の SHITEMID 構造体を含むことができました。しかし、これはもうサポートされておらず、pidl は現在では単一の子アイテムのみを参照する必要があります。

pName が指す構造体から表示名を取得する最も簡単な方法は、それを StrRetToBuf または StrRetToStr のいずれかに渡すことです。これらの関数は STRRET 構造体を受け取り、名前を返します。構造体の uType メンバーを調べて、適切なメンバーから名前を取得することもできます。

uFlags で指定されたフラグは、名前の意図された用途に関するヒントです。これらは、IShellFolder が要求された形式の名前を返すことを保証するものではありません。その形式が利用できない場合は、別の形式が返される可能性があります。特に、SHGDN_FORPARSING フラグによって返される名前が IShellFolder::ParseDisplayName によって正常に解析される保証はありません。また、フラグの組み合わせによっては、GetDisplayNameOf/ParseDisplayName の往復で元の識別子リストが返されない場合があります。これは例外的な事象ですが、念のため確認する必要があります。

Note uFlagsSHGDN_FORPARSING フラグが設定されているときに返される解析名は、必ずしも通常のテキスト文字列であるとは限りません。マイコンピューターのような仮想フォルダーは、"::{GUID}" の形式でフォルダーオブジェクトの GUID を含む文字列を返す場合があります。エンドユーザーはこれらの名前を入力または編集する必要があることが多いため、IShellFolder::GetDisplayNameOf を実装する開発者は、可能な限り表示名に近い解析名を返すことが推奨されます。
vtbl 12 HRESULT SetNameOf(HWND hwnd, ITEMIDLIST* pidl, LPWSTR pszName, SHGDNF uFlags, ITEMIDLIST** ppidlOut)

ファイルオブジェクトまたはサブフォルダーの表示名を設定し、その過程でアイテム識別子を変更します。

hwndHWNDinoptionalクライアントが表示するダイアログまたはメッセージボックスの所有者ウィンドウへのハンドル。
pidlITEMIDLIST*in親フォルダーからの相対的なファイルオブジェクトまたはサブフォルダーを一意に識別する ITEMIDLIST 構造体へのポインター。この構造体は、ちょうど 1 つの SHITEMID 構造体を含み、その後に終端のゼロが続く必要があります。
pszNameLPWSTRin新しい表示名を指定する null 終端文字列へのポインター。
uFlagsSHGDNFinpszName パラメーターで指定された名前の種類を示すフラグ。指定可能な値と値の組み合わせの一覧については、SHGDNF を参照してください。
ppidlOutITEMIDLIST**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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。