Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Agora você tem todos os elementos essenciais necessários para navegar em qualquer lugar no namespace. A maneira mais simples de começar é fazer com que o seu aplicativo chame SHGetDesktopFolder para recuperar a interface IShellFolder da área de trabalho . Em seguida, para navegar para baixo pelo namespace, seu aplicativo pode seguir estas etapas:
- Enumere o conteúdo da pasta.
- Determine quais objetos são subpastas e selecione uma.
- Vincule à subpasta para aceder à sua interface IShellFolder.
Repita estes passos sempre que necessário para atingir o objetivo.
Um exemplo simples de navegação de namespace
A parte seguinte do código de exemplo é um aplicativo de console simples que ilustra vários dos procedimentos discutidos nas seções anteriores. A verificação de erros foi omitida para maior clareza. O aplicativo executa as seguintes tarefas:
- Recupera a interfaceIShellFolder da pasta dos Programas(Usando a interface IShellFolder).
- Enumera o conteúdo da pasta (Enumerando o conteúdo de uma pasta).
- Determina todos os nomes de exibição e os imprime (Determinando nomes de exibição e outras propriedades).
- Procura por uma subpasta (Obter um ponteiro para a interface IShellFolder da subpasta).
- Associa-se à primeira subpasta que encontrar (Como obter um ponteiro para a interface IShellFolder de uma subpasta).
- Imprime os nomes de exibição dos objetos na subpasta.
#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;
}