|
// *********************************************************
// リストボックスにデスクトップのアイテム一覧を追加
// 戻り値 : 無し
// *********************************************************
void LboxEnumDesktop( HWND hList, int nIndex )
{
HRESULT hr;
IShellFolder *pDesktop;
IEnumIDList *pEnum;
ULONG pceltFetched;
LPITEMIDLIST pidlItem;
STRRET str;
char szName[MAX_PATH];
LPTSTR szBuffer;
hr = SHGetDesktopFolder( &pDesktop );
if( FAILED( hr ) ) {
return;
}
hr = pDesktop->EnumObjects(
NULL,
SHCONTF_FOLDERS |
SHCONTF_NONFOLDERS |
SHCONTF_INCLUDEHIDDEN,
&pEnum
);
if( FAILED( hr ) ) {
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 = pDesktop->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 = pDesktop->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++;
}
pEnum->Release();
pDesktop->Release();
delete [] szBuffer;
}
| |