lafe @ ウィキ
メニュー

作成したソフトウェア






プログラムtip



合計: -
今日: -
昨日: -


Shell Interfaces




IShellFolder


GetDisplayNameOf

指定されたオブジェクトファイルやサブフォルダの表示名を取得します
HRESULT GetDisplayNameOf(
  [in]   PCUITEMID_CHILD pidl,
  [in]   SHGDNF uFlags,
  [out]  STRRET *pName
);
[in] PCUITEMID_CHILD pidl: 親フォルダからの相対的なITEMIDLIST
[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 : フルパス?



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

void ILFree(
  __in  PIDLIST_RELATIVE pidl
);
アイテムIDリストを解放します
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リストは解放してはいけない
#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);
	}
}
 

何かあれば【 こちら 】まで問い合わせください

更新履歴

取得中です。