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.
Antes de poder usar um objeto de namespace, você precisa de uma maneira de identificá-lo. Isso significa obter seu ponteiro para uma lista de identificadores de itens (PIDL) ou, no caso de objetos do sistema de ficheiros, seu caminho. Esta seção discute duas das maneiras mais simples de obter IDs de objeto.
Para uma abordagem mais poderosa que funcionará com qualquer pasta, use o IShellFolder interface. Consulte Obtendo informações sobre o conteúdo de uma pasta para obter mais detalhes.
- A Caixa de Diálogo OpenFiles
- A Caixa de Diálogo SHBrowseForFolder
- Pastas especiais e CSIDLs
- Um exemplo simples de como usar CSIDLs e SHBrowseForFolder
A caixa de diálogo OpenFiles
Para permitir que o utilizador navegue pelo namespace e selecione uma pasta, a sua aplicação pode usar a interface IFileDialog. Chamar essa interface com o sinalizador FOS_PICKFOLDERS inicia a caixa de diálogo comum Arquivos abertos no modo "selecionar pastas".
Para o Windows Vista e versões posteriores, esta é a maneira recomendada de selecionar pastas.
A caixa de diálogo SHBrowseForFolder
Para permitir que o usuário navegue pelo namespace e selecione uma pasta, seu aplicativo pode simplesmente invocar SHBrowseForFolder. Chamar essa função inicia uma caixa de diálogo com uma interface do usuário que funciona um pouco como as caixas de diálogo Abrir ou Salvar como comuns.
Quando o usuário seleciona uma pasta, SHBrowseForFolder retorna o PIDL totalmente qualificado da pasta e seu nome para exibição. Se a pasta estiver no sistema de arquivos, o aplicativo pode converter o PIDL em um caminho chamando SHGetPathFromIDList. O aplicativo também pode restringir o intervalo de pastas que o usuário pode selecionar, especificando uma pasta raiz. Somente as pastas que estão abaixo dessa raiz no namespace aparecerão. A ilustração a seguir mostra a caixa de diálogo SHBrowseForFolder, com a pasta raiz definida como Arquivos de Programas.
Um exemplo simples de como usar SHBrowseForFolder é fornecido posteriormente.
Pastas especiais e identificadores CSIDL
Um número de pastas comumente usadas são designadas como especial pelo sistema. Essas pastas têm uma finalidade bem definida, e a maioria delas está presente em todos os sistemas. Mesmo que eles não estejam presentes inicialmente, seus nomes e locais ainda estão definidos, para que possam ser adicionados posteriormente. A coleção de pastas especiais inclui todas as pastas virtuais padrão do sistema, como Impressoras, Meus Documentos e Ambiente de Rede. Ele também inclui uma série de pastas padrão do sistema de arquivos, como Arquivos de Programas e Sistema.
Embora as pastas sejam um componente padrão de todos os sistemas, seus nomes e locais no namespace podem variar. Por exemplo, o diretório System é C:\Winnt\System32 em alguns sistemas e C:\Windows\System32 em outros. No passado, as variáveis de ambiente forneciam uma maneira de determinar o nome e a localização de uma pasta especial em qualquer sistema específico. O Shell agora fornece uma maneira mais robusta e flexível de identificar pastas especiais, CSIDLs. Você geralmente deve usá-los em vez de variáveis de ambiente.
Os CSIDLs fornecem uma maneira uniforme de identificar e localizar pastas especiais, independentemente de seu nome ou localização em um sistema específico. Ao contrário das variáveis de ambiente, CSIDLs podem ser usados com pastas virtuais, bem como pastas do sistema de arquivos. Cada pasta especial tem um CSIDL exclusivo atribuído a ela. Por exemplo, a pasta do sistema de arquivos Programas tem um CSIDL de CSIDL_PROGRAM_FILESe a pasta virtual Ambiente de Rede tem um CSIDL de CSIDL_NETWORK.
Um CSIDL é usado em conjunto com uma das várias funções do Shell para recuperar o PIDL de uma pasta especial ou o caminho de uma pasta especial do sistema de arquivos. Se a pasta não existir em um sistema, seu aplicativo pode forçá-la a ser criada combinando seu CSIDL com CSIDL_FLAG_CREATE. O CSIDL pode ser passado para as seguintes funções:
- SHGetFolderLocation, que obtém o PIDL de uma pasta especial.
- SHGetFolderPath, que recupera o caminho de uma pasta especial do sistema de arquivos.
Observe que estas duas funções foram introduzidas na versão 5.0 do Shell e substituem as funções SHGetSpecialFolderLocation e SHGetSpecialFolderPath.
Um exemplo simples de como usar CSIDLs e SHBrowseForFolder
A função de exemplo a seguir, PidlBrowse, ilustra como usar CSIDLs para recuperar o PIDL de uma pasta e usar SHBrowseForFolder para que o usuário selecione uma pasta. Ele retorna o PIDL e o nome de exibição da pasta selecionada.
LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL, LPSTR pszDisplayName)
{
LPITEMIDLIST pidlRoot = NULL;
LPITEMIDLIST pidlSelected = NULL;
BROWSEINFO bi = {0};
if(nCSIDL)
{
SHGetFolderLocation(hwnd, nCSIDL, NULL, NULL, &pidlRoot);
}
else
{
pidlRoot = NULL;
}
bi.hwndOwner = hwnd;
bi.pidlRoot = pidlRoot;
bi.pszDisplayName = pszDisplayName;
bi.lpszTitle = "Choose a folder";
bi.ulFlags = 0;
bi.lpfn = NULL;
bi.lParam = 0;
pidlSelected = SHBrowseForFolder(&bi);
if(pidlRoot)
{
CoTaskMemFree(pidlRoot);
}
return pidlSelected;
}
A aplicação de chamada passa um identificador de janela, que é necessário para SHBrowseForFolder. O parâmetro nCSIDL é um CSIDL opcional que é usado para especificar uma pasta raiz. Somente as pastas abaixo da pasta raiz na hierarquia serão exibidas. A ilustração mostrada anteriormente foi gerada chamando essa função com nCSIDL definido como CSIDL_PROGRAM_FILES. A aplicação de chamada também passa um buffer de cadeia de caracteres, pszDisplayName, para guardar o nome de exibição da pasta selecionada quando PidlBrowse retorna. É responsabilidade do aplicativo de chamada liberar o IDList retornado por SHBrowseForFolder usando CoTaskMemFree.