네임스페이스 탐색
이제 네임스페이스의 아무 곳이나 탐색하는 데 필요한 모든 필수 요소가 있습니다. 가장 간단한 시작 방법은 애플리케이션이 SHGetDesktopFolder 를 호출하여 데스크톱의 IShellFolder 인터페이스를 검색하도록 하는 것입니다. 그런 다음 네임스페이스를 아래쪽으로 탐색하려면 애플리케이션이 다음 단계를 수행할 수 있습니다.
- 폴더의 내용을 열거합니다.
- 하위 폴더인 개체를 결정하고 하나를 선택합니다.
- 하위 폴더에 바인딩하여 해당 IShellFolder 인터페이스를 검색합니다.
대상에 도달하기 위해 필요에 따라 이러한 단계를 자주 반복합니다.
다음 샘플 코드는 이전 섹션에서 설명한 여러 절차를 보여 주는 간단한 콘솔 애플리케이션입니다. 명확성을 위해 오류 검사를 생략했습니다. 이 애플리케이션은 다음 작업을 수행합니다.
- Program Files 폴더의 IShellFolder 인터페이스를 검색합니다(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;
}