|
// *********************************************************
// リストボックスにデスクトップ内のアイテム一覧を追加
// 戻り値 : 無し
// *********************************************************
void LboxEnumShellFolder( HWND hList, int nIndex, LPCTSTR szTarget )
{
HRESULT hr;
IShellFolder *pDesktop;
IShellFolder *pTarget;
IEnumIDList *pEnum;
ULONG pceltFetched;
LPITEMIDLIST pidlTarget;
LPITEMIDLIST pidlItem;
STRRET str;
char szName[MAX_PATH];
LPTSTR szBuffer;
_bstr_t Target("");
Target.operator = (szTarget);
hr = SHGetDesktopFolder( &pDesktop );
if( FAILED( hr ) ) {
return;
}
hr = pDesktop->ParseDisplayName(
NULL,
NULL,
Target,
NULL,
&pidlTarget,
NULL
);
if ( pidlTarget == NULL ) {
pDesktop->Release();
return;
}
hr = pDesktop->BindToObject(
pidlTarget,
NULL,
IID_IShellFolder,
(LPVOID*)&pTarget
);
if( FAILED( hr ) ) {
pDesktop->Release();
return;
}
hr = pTarget->EnumObjects(
NULL,
SHCONTF_FOLDERS |
SHCONTF_NONFOLDERS |
SHCONTF_INCLUDEHIDDEN,
&pEnum
);
if( FAILED( hr ) ) {
pTarget->Release();
pDesktop->Release();
return;
}
szBuffer = new char[MAX_PATH*2];
while( 1 ) {
hr = pEnum->Next( 1, &pidlItem, &pceltFetched );
if( FAILED( hr ) ) {
break;
}
if ( pceltFetched == 0 ) {
break;
}
hr = pTarget->GetDisplayNameOf( pidlItem, SHGDN_NORMAL, &str );
if( FAILED( hr ) ) {
continue;
}
switch( str.uType ) {
case STRRET_WSTR:
WideCharToMultiByte( CP_ACP,
0,
str.pOleStr,
-1,
szName,
MAX_PATH,
NULL,
NULL
);
CoTaskMemFree( (LPVOID)(str.pOleStr) );
break;
case STRRET_CSTR:
lstrcpyn( szName, str.cStr, MAX_PATH );
break;
default:
lstrcpyn(
szName,
(LPTSTR)pidlItem + str.uOffset,
MAX_PATH);
break;
}
lstrcpy( szBuffer, szName );
hr = pTarget->GetDisplayNameOf( pidlItem, SHGDN_FORPARSING, &str );
if( FAILED( hr ) ) {
continue;
}
switch( str.uType ) {
case STRRET_WSTR:
WideCharToMultiByte( CP_ACP,
0,
str.pOleStr,
-1,
szName,
MAX_PATH,
NULL,
NULL
);
CoTaskMemFree( (LPVOID)(str.pOleStr) );
break;
case STRRET_CSTR:
lstrcpyn( szName, str.cStr, MAX_PATH );
break;
default:
lstrcpyn(
szName,
(LPTSTR)pidlItem + str.uOffset,
MAX_PATH);
break;
}
wsprintf( szBuffer+lstrlen(szBuffer), "\t%s", szName );
LboxListInsert( hList, nIndex, szBuffer );
nIndex++;
}
pTarget->Release();
pEnum->Release();
pDesktop->Release();
delete [] szBuffer;
}
| |