#author("2018-05-26T13:15:34+09:00","default:mat2umoto","mat2umoto") #contents *シェルの基本 [#d2803a21] **参考リンク [#hcfc5b0d] http://msdn.microsoft.com/library/windows/desktop/bb773177.aspx **ファイル/フォルダの表現種類 [#x30341c6] -パス~ 通常使用されるファイルパス。\ または / 区切りの文字列でファイルへの階層を表わす。~ -PIDL~ アイテムIDリスト。以下で詳細を述べる。~ -CSIDL~ OSによって特殊な用途を与えられているフォルダ(マイコンピュータやマイドキュメントなど)を識別するためのID。 **名前空間とPIDL [#s951309d] 通常、ファイルやフォルダなど1つのオブジェクトを表すためにはパスの文字列を用いる。シェルの名前空間の考え方ではパスの代わりに、PIDL(アイテムIDリスト)を用いる。~ シェル名前空間では、最上位に位置する項目はドライブではなくデスクトップである。パスと同様、PIDLも最上位であるデスクトップから順に配下のフォルダを並べて表現する。2バイトのNULL(0)で終端を表す。~ PIDLを扱うデータ型はLPITEMIDLIST型である。LPITEMIDLISTはITEMIDLISTの並びの先頭アドレスを表す。~ typedef struct _ITEMIDLIST { SHITEMID mkid; } ITEMIDLIST; ITEMIDLIST型は、1つのSHITEMID型の変数を持つ。~ typedef struct _SHITEMID { USHORT cb; BYTE abID[1]; } SHITEMID; SHITEMIDが1つのオブジェクトを表現することになるが、通常の構造体とは違って可変長のデータとなる。~ 具体的には、abIDが1バイトではなく複数バイトを表現する。cbがSHITEMIDの1つ分の(cbも含めた)バイト数を保持する。 PIDLの構造 [SHITEMID...][SHITEMID...][SHITEMID...][NULL(2Byte)] |<---cb---->| **PIDLの種類 [#w3222e90] 絶対パスや相対パスがあるように、PIDLにも表現方法の種類が存在する。使用するAPIによってどのPIDLを使用すべきか注意が必要。~ なお、以下はこのページ内での便宜上の呼称であり、正式な用語ではない。たとえば、絶対PIDLは完全PIDLとも呼ばれる場合もある。~ -絶対PIDL~ 最上位であるデスクトップからの絶対位置をあらわしたPIDL。(デスクトップフォルダのIDは含まれない)~ 例)「C:\hoge\hoge2\a.txt」のPIDL [マイコンピュータ][C:][hoge][hoge2][a.txt][NULL(2Byte)] ↑ここがデスクトップ -相対PIDL~ あるフォルダからの相対位置をあらわしたPIDL。~ 例)「hoge」フォルダを基点とした「.\hoge2\a.txt」のPIDL [hoge2][a.txt][NULL(2Byte)] ↑ここが「hoge」 -単一PIDL~ あるフォルダの直下のオブジェクトをあらわした単一のPIDL。~ 例)「hoge」フォルダ内の「hoge2」フォルダのPIDL [hoge2][NULL(2Byte)] ↑ここが「hoge」 ↑終端の2バイトのNULLは必要 **仮想フォルダ [#kf9d47b6] 名前空間では「デスクトップ」のようにPCによって実際のパスが異なるフォルダや、「マイコンピュータ」のように実体を持たないフォルダが存在する。~ これらの特殊なフォルダは仮想フォルダと呼ばれ、PIDLやCSIDLで識別される。パスは存在しない。 *構造体 [#n9778310] **BROWSEINFO [#fad3a3d2] typedef struct _browseinfo { HWND hwndOwner; PCIDLIST_ABSOLUTE pidlRoot; LPTSTR pszDisplayName; LPCTSTR lpszTitle; UINT ulFlags; BFFCALLBACK lpfn; LPARAM lParam; int iImage; } BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO; -''概要''~ [[SHBrowseForFolder>#y6450278]]で使用するパラメータを含み、ユーザによって選択されたフォルダ情報を格納する。~ -''メンバ''~ : hwndOwner | ダイアログの親ウィンドウのハンドル。~ : pidlRoot | ルートフォルダのPIDL。ダイアログには、ルートフォルダおよびその下位フォルダのみが表示される。~ NULLを指定した場合、デスクトップがルートフォルダとして扱われる。~ : pszDisplayName | 選択されたフォルダの表示名称を受け取る。~ : lpszTitle | ツリー上部に表示するユーザに対する説明文。~ : ulFlags | ダイアログに対するオプションを指定するフラグの組み合わせ。~ :: BIF_RETURNONLYFSDIRS | ファイルシステムディレクトリのみを許可。ファイルシステムの一部ではない項目を選択している場合、OKボタンが無効化される。~ :: BIF_DONTGOBELOWDOMAIN | ドメインレベルより下のネットワークフォルダを含めない。~ :: BIF_STATUSTEXT | ダイアログにステータスエリアを表示する。コールバック関数はダイアログにメッセージを送信することで、ステータスエリアに文字列を設定することができる。~ BIF_NEWDIALOGSTYLEフラグが指定されている場合、このフラグは支援されない。~ :: BIF_RETURNFSANCESTORS | デスクトップフォルダの直下にあるファイルシステムサブフォルダのみを許可する。それ以外の項目を選択している場合、OKボタンが無効化される。~ :: BIF_EDITBOX | 項目名を入力するためのエディットボックスを表示する。~ :: BIF_VALIDATE | 項目名に無効な文字列が入力された場合、コールバック関数をBFFM_VALIDATEFAILEDメッセージを指定して呼び出す。~ BIF_EDITBOXフラグが指定されていない場合、このフラグは無視される。~ :: BIF_NEWDIALOGSTYLE | 新しいスタイルのダイアログを使用する。~ 新しいスタイルのダイアログは、再整理、削除、ショートカット、ドラッグ&ドロップ、など多くの追加機能を有する。~ :: BIF_BROWSEINCLUDEURLS | URLを表示する。BIF_USENEWUIとBIF_BROWSEINCLUDEFILESが指定されている必要がある。これらのフラグが指定されており、かつ選択された項目を含むフォルダがサポートする場合にのみ、URLの表示を行う。~ 項目の属性を問い合わせるためにフォルダのIShellFolder::GetAttributesOf()がコールされた時、SFGAO_FOLDER属性フラグが返された場合のみURLが表示される。~ :: BIF_USENEWUI | エディットボックスを持つ新しいスタイルのダイアログを使用する。~ このフラグは、BIF_EDITBOX | BIF_NEWDIALOGSTYLE と等しい。~ あらかじめCoInitializeEx()にCOINIT_MULTITHREADEDを指定してCOMを初期化している場合、このフラグを使用すると[[SHBrowseForFolder>#y6450278]]は失敗する。~ :: BIF_UAHINT | BIF_NEWDIALOGSTYLEフラグとともに指定すると、エディットボックスの代わりにダイアログボックスの使用に関するヒントを表示する。~ BIF_EDITBOXフラグが指定されると、このフラグは無効化される。~ :: BIF_NONEWFOLDERBUTTON | 「新しいフォルダ」ボタンを表示しない。~ :: BIF_NOTRANSLATETARGETS | ショートカットを選択した場合、リンク先ではなくショートカットファイル自体のPIDLを返す。~ :: BIF_BROWSEFORCOMPUTER | コンピュータのみを許可。それ以外の項目を選択している場合、OKボタンが無効化される。~ :: BIF_BROWSEFORPRINTER | プリンタのみを許可。それ以外の項目を選択している場合、OKボタンが無効化される。~ Windows XP以降では、ルートフォルダを「プリンタとFAX」(CSIDL_PRINTERS)に設定し、XPスタイルを用いることが推奨される。~ :: BIF_BROWSEINCLUDEFILES | ファイルを表示する。~ :: BIF_SHAREABLE | リモートシステム上にある共有リソースを表示する。~ BIF_NEWDIALOGSTYLEフラグが指定されている必要がある。~ :: BIF_BROWSEFILEJUNCTIONS | 圧縮ファイルの内容を表示。(Windows 7 以降)~ : lpfn | コールバック関数。詳細はBrowseCallbackProcを参照。使用しない場合はNULLを指定できる。~ : lParam | コールバック関数に渡されるパラメータ。~ : iImage | 選択されたフォルダの、システムアイコンリスト中のインデックス。~ -''備考''~ なし~ *関数 [#o5d2decc] **CoTaskMemAlloc [#h1e2443c] LPVOID CoTaskMemAlloc( __in SIZE_T cb ); -''概要''~ メモリを確保する。~ -''パラメータ''~ : cb | [in] 割り当てるメモリのバイト単位のサイズ。~ -''戻り値''~ 正常終了した場合は割り当てられたメモリのアドレスを返す。それ以外の場合はNULLを返す。~ -''備考''~ IMalloc::Allocと同じ方法でメモリを割り当てる。~ 割り当てられたメモリの内容は未定義。保守情報を付与するために、割り当てられたメモリがcbで指定したサイズより大きくなることがある。~ cbに0を指定した場合、本関数は長さ0のメモリを割り当ててそのアドレスを返す。利用できる十分なメモリがない場合、本関数はNULLを返す。 **CoTaskMemRealloc [#h92743ab] LPVOID CoTaskMemRealloc( __in_opt LPVOID pv, __in SIZE_T cb ); -''概要''~ 前もって確保されているメモリのサイズを変更する。~ -''パラメータ''~ : pv | [in] 再確保するメモリのアドレス。NULLを指定できる。~ : cb | [in] 再確保するメモリのバイト単位のサイズ。0を指定できる。~ -''戻り値''~ 正常終了した場合は割り当てられたメモリのアドレスを返す。それ以外の場合はNULLを返す。~ -''備考''~ IMalloc::Reallocと同じ方法でメモリを割り当てる。~ pvには、以前にCoTaskMemAllocによって返されたアドレスを指定する必要がある。pvがNULLの場合は、新しいメモリが確保される。~ メモリは別の場所に割り当てられることもあるが、新旧のメモリのうち小さい方のサイズ分は内容が不変となる。~ cbが0でpvがNULL以外の場合、pvのメモリが解放される。再割り当てするための十分なメモリが確保できない場合、pvのメモリは変更されない。戻り値は、どちらの場合もNULLとなる。~ **CoTaskMemFree [#d6cc4a00] void CoTaskMemFree( LPVOID pv ); -''概要''~ 前もって確保されているメモリを解放する。~ -''パラメータ''~ : pv | [in] 解放するメモリのアドレス。~ -''戻り値''~ なし。~ -''備考''~ 解放されるサイズは、割り当てられていたサイズと同じとなる。~ **SHGetMalloc [#d132733b] HRESULT SHGetMalloc( LPMALLOC *ppMalloc ); -''概要''~ IMallocインタフェースを取得する。 -''パラメータ''~ : ppMalloc | [out] IMallocインタフェースのポインタ。~ -''戻り値''~ 正常終了した場合はS_OKを返す。それ以外の場合はHRESULT型のエラーコードを返す。~ -''備考''~ 現在(正確にはWindows2000以降のOS)では使用する必要がなくなった。代わりに同等の関数であるCoTaskMemAlloc、CoTaskMemReallocおよびCoTaskMemFreeを使用できる。~ 使用後にIUnknown::ReleaseをコールしてIMallocインタフェースを解放すること。 **SHGetDesktopFolder [#c6890885] HRESULT SHGetDesktopFolder( __out IShellFolder **ppshf ); -''概要''~ シェル名前空間の最上位をあらわすデスクトップフォルダのIShellFolderインタフェースを取得する。 -''パラメータ''~ : ppshf | [out] デスクトップフォルダのIShellFolderインタフェースのポインタ。~ -''戻り値''~ 正常終了した場合はS_OKを返す。それ以外の場合はHRESULT型のエラーコードを返す。~ -''備考''~ 使用後にIUnknown::ReleaseをコールしてIShellFolderインタフェースを解放すること。 **SHGetPathFromIDList [#i9f0dd6e] BOOL SHGetPathFromIDList( __in PCIDLIST_ABSOLUTE pidl, __out LPTSTR pszPath ); -''概要''~ PIDLからパスを取得する。 -''パラメータ''~ : pidl | [in] 対象とするファイルやフォルダの絶対PIDL。~ : pszPath | [out] パスを受け取るバッファ。少なくともMAX_PATH文字分のサイズがあること。~ -''戻り値''~ 正常終了した場合はTRUEを返す。それ以外の場合はFALSEを返す。~ -''備考''~ pidlによって指定された位置がファイルシステムの一部ではない場合、本関数は失敗する。~ pidlがショートカットファイルを指している場合、取得されるパスはショートカットファイル自体のパスではなく、ショートカットのターゲットのパスとなる。 **SHGetDataFromIDList [#d225cf7e] HRESULT SHGetDataFromIDList( __in IShellFolder *psf, __in PCUITEMID_CHILD pidl, int nFormat, __out void *pv, int cb ); -''概要''~ PIDLから拡張プロパティデータを取得する。 -''パラメータ''~ : psf | [in] 基準となるフォルダのISHellFolderインタフェース。基準フォルダは、pidlの親にあたる必要がある。~ : pidl | [in] 対象とするファイルやフォルダの、基準フォルダからの相対PIDL。~ : nFormat | [in] 取得するデータの形式。~ :: SHGDFIL_FINDDATA | ファイルシステムオブジェクトに使用される形式。pvにはWIN32_FIND_DATA型のデータが返される。~ :: SHGDFIL_NETRESOURCE | ネットワークリソースに使用される形式。pvにはNETRESOURCE型のデータが返される。~ :: SHGDFIL_DESCRIPTIONID | ネットワークリソースに使用される形式。pvにはSHDESCRIPTIONID型のデータが返される。~ : pv | [out] データを受け取るバッファへのポインタ。データの形式はnFormatによって決定される。~ nFormatがSHGDFIL_NETRESOURCEの場合、2つのケースに分けられる。バッファが十分に大きければ、ネットワークリソースの文字列情報(フィールド、ローカル名、プロバイダ、コメント)はバッファに配置される。バッファが大きくなければ、文字列情報はNULLとなる。 : cb | [in] pvのバイト単位のサイズ。~ -''戻り値''~ 正常終了した場合はS_OKを返す。それ以外の場合はE_INVALIDARGを返す。~ -''備考''~ 本関数が呼び出された時点での状態を返すため、最新の状態とは異なる場合がある。~ バッファにはPIDLに存在する情報のみ返される。それはPIDLを作成したフォルダオブジェクトに依存するため、全ての情報が利用可能となる保証はない。たとえば、WIN32_FIND_DATA型のデータを返す場合、利用不可能な情報には0が入れられる。ファイルやフォルダの完全な情報が必要な場合は、GetFileTimeやFindFirstFileなどの標準のファイルシステム関数を利用すること。 **SHGetFolderLocation [#nc21d8d2] HRESULT SHGetFolderLocation( __in HWND hwndOwner, __in int nFolder, __in HANDLE hToken, __reserved DWORD dwReserved, __out PIDLIST_ABSOLUTE *ppidl ); -''概要''~ CLSIDからPIDLを取得する。 -''パラメータ''~ : hwndOwner | [in] 予約。~ : nFolder | [in] フォルダの配置を識別するCLSID。CLSIDに関連付けられたフォルダはシステム上に実態を持たない可能性がある。~ : hToken | [in] 特定のユーザを表すアクセストークン。~ 通常はNULLでよいが、特定のユーザによって使用されるフォルダを識別する場合に必要になる。(マイドキュメントなど)-1を指定することで、デフォルトユーザをあらわす。~ : dwReserved | [in] 予約。~ : ppidl | [out] 絶対PIDL。本関数が失敗した場合はNULLとなる。~ -''戻り値''~ 正常終了した場合はS_OKを返す。それ以外の場合はE_INVALIDARGを返す。~ -''備考''~ 使用後にILFreeをコールしてppidlを解放すること。 **SHGetFolderPath [#n8d8c9dd] HRESULT SHGetFolderPath( __in HWND hwndOwner, __in int nFolder, __in HANDLE hToken, __in DWORD dwFlags, __out LPTSTR pszPath ); -''概要''~ CSIDLからパスを取得する。 -''パラメータ''~ : hwndOwner | [in] 予約。~ : nFolder | [in] フォルダの配置を識別するCSIDL。システム上に実態を持たない仮想フォルダの場合は本関数は失敗する。~ CSIDL_FLAG_CREATEをOR指定することで、フォルダの作成を強制することができる。~ : hToken | [in] 特定のユーザを表すアクセストークン。~ 通常はNULLでよいが、特定のユーザによって使用されるフォルダを識別する場合に必要になる。(マイドキュメントなど)-1を指定することで、デフォルトユーザをあらわす。~ : dwFlags | [in] 返されるパスを指定するフラグ?~ :: SHGFP_TYPE_CURRENT | フォルダの現在のパス。~ :: SHGFP_TYPE_DEFAULT | フォルダのデフォルトのパス。~ : pszPath | [out] 返されるパス。本関数がエラーの場合は空文字列となる。~ 返される文字列には末尾に「\」が含まれない。たとえば、「C:\User\」ではなく「C:\User」と返される。~ -''戻り値''~ 正常終了した場合はS_OKを返す。~ CSIDLは有効だがフォルダが存在しない場合、S_FALSE(ANSI版)かE_FAIL(Unicode版)を返す。CSIDLが無効の場合、E_INVALIDARGを返す。~ -''備考''~ なし。 **SHGetFileInfo [#c227592c] DWORD_PTR SHGetFileInfo( __in LPCTSTR pszPath, DWORD dwFileAttributes, __inout SHFILEINFO *psfi, UINT cbFileInfo, UINT uFlags ); -''概要''~ ファイル、フォルダ、ドライブなど、ファイルシステム中のオブジェクトに関する情報を取得する。 -''パラメータ''~ : pszPath | [in] 対象オブジェクトを、相対パスまたは絶対パスで指定。ロングファイル名とショートファイル名(8.3形式)のどちらも使用可能。~ uFlagsがSHGFI_PIDLを含む場合、このパラメータには対象オブジェクトの絶対PIDLを指定する必要がある。~ uFlagsがSHGFI_USEFILEATTRIBUTESを含む場合、このパラメータには存在しないファイルパスを渡すことができる。あたかもファイルが指定された名前(pszPath)と属性(dwFileAttributes)で存在するかのように機能する。 : dwFileAttributes | [in] ファイル属性フラグ(Winnt.hに定義されている)の組み合わせで指定する。~ uFlagsがSHGFI_USEFILEATTRIBUTESフラグを含んでいない場合、このパラメーターは無視される。 : psfi | [in, out] ファイル情報を受け取るSHFILEINFO構造体のアドレス。~ : cbFileInfo | [in] psfiで指定されるSHFILEINFO構造体のバイト単位のサイズ。~ : uFlags | [in] 取得するファイル情報を指定するフラグ。次の値の組み合わせで指定する。~ :: SHGFI_ADDOVERLAYS | SHGFI_ICONフラグで取得されるアイコンに、適切なオーバーレイアイコンを加える。~ このフラグはSHGFI_ICONフラグとともに指定する必要がある。~ :: SHGFI_ATTR_SPECIFIED | SHGFI_ATTRIBUTESフラグの取得対象として、SHFILEINFO構造体のdwAttributesに取得したい特定の属性を指定可能となる。これらの属性はIShellFolder::GetAttributesOf()に渡される。このフラグが指定されていない場合、IShellFolder::GetAttributesOf()には全ての属性を取得対象とするために0xFFFFFFFFが渡される。~ このフラグはSHGFI_ICONフラグとともに指定することはできない。~ :: SHGFI_ATTRIBUTES | 属性情報。SHFILEINFO構造体のdwAttributesで返される。IShellFolder::GetAttributesOfから得られるのと同じ属性となる。~ :: SHGFI_DISPLAYNAME | 表示名称(ロングファイル名)。SHFILEINFO構造体のszDisplayNameで返される。~ :: SHGFI_EXETYPE | 実行ファイルのタイプ。pszPathで実行ファイルを指定した場合のみ。情報は戻り値で返される。このフラグは他のフラグと組み合わせることができない。~ :: SHGFI_ICON | システムイメージリスト内のアイコンを表わすインデックスおよびアイコンへのハンドル。インデックスはSHFILEINFO構造体のiIconで返され、ハンドルはhIconで返される。~ :: SHGFI_ICONLOCATION | 項目のアイコンを含むファイルパスとそのアイコンインデックス。(IExtractIcon::GetIconLocation()と同じ情報が返される)ファイルパスはSHFILEINFO構造体のszDisplayNameで返され、インデックスはiIconで返される。~ :: SHGFI_LARGEICON | SHGFI_ICONフラグで取得されるアイコンを、ファイルの大きいアイコンとする。~ このフラグはSHGFI_ICONフラグとともに指定する必要がある。~ :: SHGFI_LINKOVERLAY | SHGFI_ICONフラグで取得されるアイコンに、リンクオーバーレイを加える。~ このフラグはSHGFI_ICONフラグとともに指定する必要がある。~ :: SHGFI_OPENICON | SHGFI_ICONフラグで取得されるアイコンを、ファイルが開いたアイコンとする。~ このフラグはSHGFI_ICONフラグとSHGFI_SYSICONINDEXフラグの少なくともどちらか一方とともに指定する必要がある。~ :: SHGFI_OVERLAYINDEX | オーバーレイアイコンのインデックス。インデックスはSHFILEINFO構造体のiIconの上位8ビットで返される。~ このフラグはSHGFI_ICONフラグとともに指定する必要がある。~ :: SHGFI_PIDL | pszPathがファイルパスではなくPIDLであることを示す。~ :: SHGFI_SELECTED | SHGFI_ICONフラグで取得されるアイコンに、システムのハイライト色を加える。~ このフラグはSHGFI_ICONフラグとともに指定する必要がある。~ :: SHGFI_SHELLICONSIZE | SHGFI_ICONフラグで取得されるアイコンを、シェルサイズのアイコンとする。このフラグが指定されていない場合、システムメトリック値が用いられる。~ このフラグはSHGFI_ICONフラグとともに指定する必要がある。~ :: SHGFI_SMALLICON | SHGFI_ICONフラグで取得されるアイコンを、ファイルの小さいアイコンとする。~ このフラグはSHGFI_ICONフラグとSHGFI_SYSICONINDEXフラグの少なくともどちらか一方とともに指定する必要がある。~ :: SHGFI_SYSICONINDEX | システムイメージリスト内のアイコン。インデックスはSHFILEINFO構造体のiIconで返され、システムイメージリストへのハンドルは戻り値で返される。~ :: SHGFI_TYPENAME | ファイルタイプの文字列。SHFILEINFO構造体のszTypeNameで返される。~ :: SHGFI_USEFILEATTRIBUTES | pszPathで指定されたファイルにアクセスすべきでないことを示す。~ このフラグは、SHGFI_ATTRIBUTES、SHGFI_EXETYPE、SHGFI_PIDLと組み合わせることができない。~ -''戻り値''~ uFlagに依存する値を返す。~ uFlagsがSHGFI_EXETYPEまたはSHGFI_SYSICONINDEXを含んでいない場合、成功したら非0、それ以外の場合は0を返す。~ uFlagsがSHGFI_EXETYPEフラグを含んでいる場合、実行ファイルのタイプを返す。以下に詳細を記述する。~ 0の場合、実行ファイルではないかエラー。~ 下位ワードがNEまたはPEで上位ワードがWindowsのバージョン(16進数)の場合、Windowsアプリケーション。~ 下位ワードがMZで上位ワードが0の場合、MS-DOSの*.exeファイルか*.comファイル。~ 下位ワードがPEで上位ワードが0の場合、コンソールアプリケーションか、*.batファイル。~ -''備考''~ 本関数はバックグラウンドのスレッドからコールされるべき。そうでないと、UIが返答をやめる場合がある。~ SHFILEINFO構造体のhIconにアイコンハンドルが返された場合、使用後に::DestroyIcon()で開放する必要がある。~ 取得したシステムイメージリストの情報は、読み取り専用として扱うべきで、変更してはいけない。~ 本関数を呼ぶ前にCoInitialize()かOleInitialize()でCOMを初期化しなければならない。~ **SHBindToParent [#f646515f] HRESULT SHBindToParent( __in PCIDLIST_ABSOLUTE pidl, __in REFIID riid, __out VOID **ppv, __out PCUITEMID_CHILD *ppidlLast ); -''概要''~ 絶対PIDLから、その親フォルダの指定されたインタフェースを返す。 -''パラメータ''~ : pidl | [in] 対象オブジェクトの絶対PIDL。~ : riid | [in] 対象オブジェクトの親フォルダによって公開されるインタフェースのうちの1つをあらわすREFIID。~ : ppv | [out] riidで指定されたインタフェースのポインタ。使用後に開放する必要がある。~ : ppidlLast | [out] 対象オブジェクトの親フォルダのPIDL。不要な場合はNULLを指定することが可能。~ 本関数はこの引数のために新たにメモリ確保することはしないため、使用後にppidlLastを解放する必要は無い。~ -''戻り値''~ 成功した場合はS_OK、それ以外の場合はHRESULTエラーコードを返す。~ -''備考''~ なし~ **SHBrowseForFolder [#y6450278] PIDLIST_ABSOLUTE SHBrowseForFolder( __in LPBROWSEINFO lpbi ); -''概要''~ フォルダ選択ダイアログを表示。~ -''パラメータ''~ : lpbi | [in] ダイアログを表示するための情報を含んだ、[[BROWSEINFO>#fad3a3d2]]構造体のアドレス。~ -''戻り値''~ 選択されたフォルダを表わす絶対PIDLを返す。キャンセルボタンが押下された場合はNULLを返す。~ 返されるPIDLがフォルダショートカットの可能性がある。~ -''備考''~ Windows Vista以降のOSでは、FOS_PICKFOLDERSオプションを指定したIFileDialogインタフェースを使用することが推奨される。~ ~ 本関数を呼ぶ前、CoInitialize()、CoInitializeEx()、OleInitialize()のいずれかを用いてCOMを初期化する必要がある。~ CoInitializeEx()を用いる場合、dwCoInitにCOINIT_APARTMENTTHREADEDフラグをセットする必要がある。~ ドラッグ&ドロップ機能も必要であれば、OleInitialize()を用いることが推奨される。~ ~ CoInitializeEx()でCOINIT_MULTITHREADEDフラグを指定してCOMを初期化した場合、BIF_USENEWUIフラグかBIF_NEWDIALOGSTYLEフラグを使用すると本関数は失敗する。~ ~ 返されたPIDLは、使用後にCoTaskMemFree()を用いて開放する必要がある。~ ~ 利用可能なフォルダ選択ダイアログは2種類存在する。~ 古いスタイルのダイアログは、サイズを変更することができない。~ 新しいスタイルのダイアログは、再整理、削除、ショートカット、ドラッグ&ドロップ、など多くの追加機能を有する。デフォルトで古いダイアログよりも大きく表示されるが、サイズの変更が可能である。~ 新しいスタイルのダイアログを使用する場合は、[[BROWSEINFO>#fad3a3d2]]構造体のulFlagsに、BIF_USENEWUIフラグを指定する。~ ~ [[BROWSEINFO>#fad3a3d2]]構造体のulFlagsに、BIF_RETURNONLYFSDIRSフラグが指定されている場合、「\\server」のようなサーバー上の項目に対して有効なままとなる。~ サーバー上の項目のPIDLが返された場合、それをSHGetPathFromIDList()に渡すと失敗する。~ ~ (一部省略) SHFileOperation // 各種ファイル操作。ゴミ箱へ移動など。 StrRetToBuf // STRRET構造体->文字列。 StrRetToStr // STRRET構造体->文字列。関数内でメモリ確保されるため使用後に解放すること。 SHChangeNotify SHAddToRecentDocs ExtractIcon FindExecutable SHFileOperation StrFormatByteSize64 ILAppendID ILFree ILClone ILCloneFirst ILCombine *インタフェース [#x0828520] **IMalloc [#df2ab2cd] シェルのメモリ管理用インタフェース。~ 現在(正確にはWindows2000以降のOS)は使用する必要はなく、代わりにCoTaskMemAlloc、CoTaskMemRealloc、CoTaskMemFreeを用いる。 IShellFolder フォルダオブジェクトが必ず備えている基礎となるインタフェース。 そのフォルダの他のインタフェースもこれを経由して取得することになる。 IEnumIDList サブフォルダの列挙 IContextMenu コンテキストメニュー(エクスプローラ上の右クリックメニュー) IContextMenu2 IContextMenu3 IExtractIcon IShellLink ショートカットに使用? IPersistFile ショートカットに使用? IShellFolder::BindToObject // サブフォルダの1段階PIDLに結び付けられた新しいIShellFolderを取得 IShellFolder::CompareIDs // PIDL同士を比較 IShellFolder::CreateViewObject // IShellFolder::EnumObjects // サブフォルダ列挙用のIEnumIDListを取得。使用後にReleaseすること。 IShellFolder::GetAttributesOf // フォルダ属性の取得 IShellFolder::GetDisplayNameOf // 表示名称をSTRRET構造体で取得。 IShellFolder::GetUIObjectOf // 別のインタフェースを取得。(IContextMenuなど)使用後にReleaseすること。 IShellFolder::ParseDisplayName // パス->PIDL IShellFolder::SetNameOf // リネーム IEnumIDList::Clone // 現在の列挙状態を複製した新しいIEnumIDListを取得。使用後にReleaseすること。 IEnumIDList::Next // 順番にサブフォルダの1段階のPIDLを返し、列挙状態を1つ進める。返されたPIDLは使用後にメモリ解放する必要あり。全てのサブフォルダを取得し終えたら、S_FALSEが返される。 IEnumIDList::Reset // 列挙状態を初期化する。 IEnumIDList::Skip // 指定した数だけ列挙状態を進める。