lafe @ ウィキ
Shell Interfaces
最終更新:
lafe
-
view
IShellFolder
GetDisplayNameOf
指定されたオブジェクトファイルやサブフォルダの表示名を取得します
HRESULT GetDisplayNameOf(
[in] PCUITEMID_CHILD pidl,
[in] SHGDNF uFlags,
[out] STRRET *pName
);
[in] PCUITEMID_CHILD pidl: 親フォルダからの相対的なITEMIDLIST
[in] SHGDNF uFlags: 名前表示の種類を要求するために使用。可能な値のリストについては、SHGDNF列挙型をご覧ください。
[in] SHGDNF uFlags: 名前表示の種類を要求するために使用。可能な値のリストについては、SHGDNF列挙型をご覧ください。
IFolderView2
GetSelectedItem
現在選択されたアイテムのインデックスを返します
HRESULT GetSelectedItem(
[in] int iStart,
[out] int *piItem
);
列挙型
引数に指定したりするやつ
SHGDNF
typedef enum _SHGDNF {
SHGDN_NORMAL = 0,
SHGDN_INFOLDER = 0x1,
SHGDN_FOREDITING = 0x1000,
SHGDN_FORADDRESSBAR = 0x4000,
SHGDN_FORPARSING = 0x8000
} SHGDNF;
SHGDN_NORMAL : エクスプローラーに表示されている名前
SHGDN_FORADDRESSBAR : アドレスバーコンボボックスに表示されている名前
SHGDN_FORPARSING : フルパス?
SHGDN_FORADDRESSBAR : アドレスバーコンボボックスに表示されている名前
SHGDN_FORPARSING : フルパス?
SIGDN
typedef enum _SIGDN {
SIGDN_NORMALDISPLAY = 0x00000000,
SIGDN_PARENTRELATIVEPARSING = (int)0x80018001,
SIGDN_DESKTOPABSOLUTEPARSING = (int)0x80028000,
SIGDN_PARENTRELATIVEEDITING = (int)0x80031001,
SIGDN_DESKTOPABSOLUTEEDITING = (int)0x8004c000,
SIGDN_FILESYSPATH = (int)0x80058000,
SIGDN_URL = (int)0x80068000,
SIGDN_PARENTRELATIVEFORADDRESSBAR = (int)0x8007c001,
SIGDN_PARENTRELATIVE = (int)0x80080001
} SIGDN;
SIGDN_NORMALDISPLAY : この名前は一般的にユーザーへの表示に最適です。
SH系
ILCombine
PIDLIST_ABSOLUTE ILCombine(
__in PCIDLIST_ABSOLUTE pidl1,
__in PCUIDLIST_RELATIVE pidl2
);
pidl1とpidl2の二つのアイテムIDリストを結合します
使い終わったらILFreeなどで解放する必要があります
使い終わったらILFreeなどで解放する必要があります
ILFree
void ILFree(
__in PIDLIST_RELATIVE pidl
);
アイテムIDリストを解放します
When using Windows 2000 or later, use CoTaskMemFree rather than ILFree.
と書いてるがどうなんだろう
When using Windows 2000 or later, use CoTaskMemFree rather than ILFree.
と書いてるがどうなんだろう
CoTaskMemFree
void CoTaskMemFree(
__in_opt LPVOID pv
);
ILRemoveLastID
ITEMIDLIST構造体から最後のSHITEMID構造体を削除します。
BOOL ILRemoveLastID(
__inout PUIDLIST_RELATIVE pidl
);
SHCreateItemFromIDList
アイテムIDリストからIShellItemインターフェイスを取得します
HRESULT SHCreateItemFromIDList(
__in PCIDLIST_ABSOLUTE pidl,
__in REFIID riid,
__out void **ppv
);
SHGetNameFromIDList
アイテムIDリストから名前などを取得します
HRESULT SHGetNameFromIDList(
__in PCIDLIST_ABSOLUTE pidl,
__in SIGDN sigdnName,
__out PWSTR *ppszName
);
__in SIGDN sigdnName : 表示名のタイプを取得するためにSIGDN列挙の値を指定します。
使い終わったらppszNameをCoTaskMemFreeで解放してください。
SHGetPathFromIDList
アイテムIDリストからファイルシステムパスに変換します
BOOL SHGetPathFromIDList(
__in PCIDLIST_ABSOLUTE pidl,
__out LPTSTR pszPath
);
__out LPTSTR pszPath : MAX_PATH以上のバッファのサイズが必要です
SHILCreateFromPath
絶対パスからアイテムIDリストを取得します
HRESULT SHILCreateFromPath(
__in LPCWSTR pszPath,
__out PIDLIST_ABSOLUTE *ppidl,
__inout DWORD *rgflnOut
);
SHCreateShellItemArrayFromDataObject
IDataObjectからIShellItemArrayを作ります
HRESULT SHCreateShellItemArrayFromDataObject(
__in IDataObject *pdo,
__in REFIID riid,
__out void **ppv
);
SHGetIDListFromObject
IShellItem などからITEMIDLISTを得られます
HRESULT SHGetIDListFromObject(
__in IUnknown *punk,
__out PIDLIST_ABSOLUTE *ppidl
);
SHDoDragDrop
ドラッグアンドドロップ操作の実行。必要に応じて、ドラッグイメージとドラッグソースの作成をします。
HRESULT SHDoDragDrop(
__in HWND hwnd,
__in IDataObject *pdtobj,
__in IDropSource *pdsrc,
__in DWORD dwEffect,
__out DWORD *pdwEffect
);
ILIsEqual Function
二つのアイテムIDリストを比較します
BOOL ILIsEqual(
__in PCIDLIST_ABSOLUTE pidl1,
__in PCIDLIST_ABSOLUTE pidl2
);
etc
OLE Drag&Dropでのパスの取り出し方
IDataObjectからのパスの取り出し方と言うべきか
pida->cidlに取り出せるアイテムIDリストの数が入っている
GetPIDLFolderやGetPIDLItemで取ったアイテムIDリストは解放してはいけない
pida->cidlに取り出せるアイテムIDリストの数が入っている
GetPIDLFolderやGetPIDLItemで取ったアイテムIDリストは解放してはいけない
#define GetPIDLFolder(pida) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[0])
#define GetPIDLItem(pida, i) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[i+1])
OnDragEnter(IDataObject *pDataObject, DWORD dwKeyState, CPoint point)
{
HRESULT hr;
FORMATETC fmt;
fmt.cfFormat= RegisterClipboardFormat(CFSTR_SHELLIDLIST);
fmt.ptd = NULL;
fmt.dwAspect= DVASPECT_CONTENT;
fmt.lindex = -1;
fmt.tymed = TYMED_HGLOBAL;
STGMEDIUM medium;
hr = pDataObject->GetData(&fmt, &medium)
if (hr == S_OK) {
LPIDA pida = (LPIDA)::GlobalLock(medium.hGlobal);
LPCITEMIDLIST pParentidl = GetPIDLFolder(pida);
LPCITEMIDLIST pidl = GetPIDLItem(pida, 0);
LPITEMIDLIST pCombineidl = ::ILCombine(pParentidl, pidl);
CString str = PidlToString(pCombineidl); // パスが取れる
::ILFree(pCombineidl);
::GlobalUnlock(medium.hGlobal);
::ReleaseStgMedium(&medium);
} else {
ATLASSERT(FALSE);
}
}