訓練
流覽命名空間
您現在擁有在命名空間中任何位置巡覽所需的所有基本元素。 啟動最簡單的方式是讓應用程式呼叫 SHGetDesktopFolder 來擷取桌面的 IShellFolder 介面。 然後,若要向下流覽命名空間,您的應用程式可以遵循下列步驟:
- 列舉資料夾的內容。
- 判斷哪些物件是子資料夾,然後選取一個。
- 系結至子資料夾以擷取其 IShellFolder 介面。
視需要重複這些步驟以達到目標。
下列範例程式碼片段是簡單的主控台應用程式,說明上述各節所討論的一些程式。 已省略錯誤檢查,以便清楚起見。 此應用程式會執行下列工作:
- 使用 IShellFolder 介面) 擷取 Program Files 資料夾的IShellFolder介面 (。
- 列舉資料夾的內容 (列舉資料夾) 的內容 。
- 決定所有顯示名稱,並列印 (判斷顯示名稱和其他屬性) 。
- 尋找子資料夾 (取得子資料夾 IShellFolder 介面) 的指標。
- 系結至它找到的第一個子資料夾 (取得子資料夾的 IShellFolder 介面 指標) 。
- 列印子資料夾中物件的顯示名稱。
#include <shlobj.h>
#include <shlwapi.h>
#include <iostream.h>
main()
{
LPITEMIDLIST pidlProgFiles = NULL;
LPITEMIDLIST pidlItems = NULL;
IShellFolder *psfFirstFolder = NULL;
IShellFolder *psfDeskTop = NULL;
IShellFolder *psfProgFiles = NULL;
LPENUMIDLIST ppenum = NULL;
ULONG celtFetched;
HRESULT hr;
STRRET strDispName;
TCHAR pszDisplayName[MAX_PATH];
ULONG uAttr;
CoInitialize( NULL );
hr = SHGetFolderLocation(NULL, CSIDL_PROGRAM_FILES, NULL, 0, &pidlProgFiles);
hr = SHGetDesktopFolder(&psfDeskTop);
hr = psfDeskTop->BindToObject(pidlProgFiles, NULL, IID_IShellFolder, (LPVOID *) &psfProgFiles);
psfDeskTop->Release();
hr = psfProgFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfProgFiles->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
cout << pszDisplayName << '\n';
if(!psfFirstFolder)
{
uAttr = SFGAO_FOLDER;
psfProgFiles->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr);
if(uAttr & SFGAO_FOLDER)
{
hr = psfProgFiles->BindToObject(pidlItems, NULL, IID_IShellFolder, (LPVOID *) &psfFirstFolder);
}
}
CoTaskMemFree(pidlItems);
}
cout << "\n\n";
ppenum->Release();
if(psfFirstFolder)
{
hr = psfFirstFolder->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfFirstFolder->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);
cout << pszDisplayName << '\n';
CoTaskMemFree(pidlItems);
}
}
ppenum->Release();
CoTaskMemFree(pidlProgFiles);
psfProgFiles->Release();
psfFirstFolder->Release();
CoUninitialize();
return 0;
}