ID do artigo: 310294 - Última revisão: quinta-feira, 20 de março de 2008 - Revisão: 3.1

Como escrever um aplicativo do Windows XP que armazena dados de usuário e aplicativo no local correto usando o Visual C++

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
importante Este artigo contém informações sobre como modificar o registro. Certifique-se de que você faça backup do registro antes de modificá-lo. Certifique-se que você sabe como restaurar o registro se ocorrer um problema. Para obter mais informações sobre como fazer backup, restaurar e modificar o registro, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
322756  (http://support.microsoft.com/kb/322756/ ) Como fazer backup e restaurar o registro no Windows
Observação Microsoft Visual C++ .NET 2002, Microsoft Visual C++ .NET 2003, Microsoft Visual C++ 2005 e Microsoft Visual C++ 2008 oferecem suporte o modelo de código gerenciado que é fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado. As informações neste artigo se aplicam somente a código do Visual C++ não gerenciado

Nesta página

Expandir tudo | Recolher tudo

Sumário

Aplicativos funcionam com dois tipos de documentos: aqueles que o usuário cria e aqueles que o aplicativo cria. Os aplicativos devem usar a função de shell SHGetFolderPath para recuperar locais de pasta válida para armazenar dados que é específicos para o usuário e o aplicativo. Isso é essencial para aplicativos do Windows XP para oferecer suporte a vários usuários que estiverem usando o mesmo computador e para habilitar usuários alternar rapidamente.

Este artigo descreve como armazenar dados de usuário no lugar correto nas etapas a seguir:
  • Crie um aplicativo Win32.
  • Adicione uma opção de Salvar como ao menu arquivo .
  • Use a padrão caixa de diálogo Salvar arquivo como padrão para o local correto.
  • Verifique se o arquivo correto local de salvamento.
  • Lembre-se a seleção do usuário anterior.
  • Verifique se a seleção do usuário anterior.
Nas etapas a seguir, este artigo também descreve onde você deve armazenar dados de aplicativo e como garantir que ele é armazenado nos locais apropriados:
  • Classificar dados de aplicativo.
  • Armazenar dados de aplicativo no local correto.
  • Use o registro criteriosamente.

Requisitos

A lista a seguir descreve recomendado de hardware, software, infra-estrutura de rede, habilidades, conhecimento e service packs que você precisa:
  • Windows XP Home Edition ou Windows XP Professional
  • O Visual Studio 2008, o Visual Studio 2005 ou o Visual Studio .NET.
  • Conhecimento prévio do desenvolvimento de aplicativos Win32

Criar um aplicativo Win32

Inicie o Visual Studio e crie um novo aplicativo Win32 chamado SavingData.
  • No Visual Studio. NET, clique em Projetos do Visual c++ em Tipos de projeto e, em seguida, clique em Projeto Win32 em modelos . Aceite as configurações de aplicativo padrão que exibe o Assistente para instalação do aplicativo.
  • No Visual Studio 2005 ou 2008, clique em Visual C++ em Tipos de projeto e, em seguida, clique em Projeto Win32 em modelos . Aceite as configurações de aplicativo padrão.

Adicionar um Salvar como opção de Menu Arquivo

  1. Clique em Modo de exibição de recurso e, em seguida, clique duas vezes em IDC_SAVINGDATA .
  2. Adicione uma opção de menu Salvar como ao menu arquivo . Use IDM_FILE_SAVEAS como a identificação do item de menu.
  3. Localize o procedimento de janela do aplicativo WndProc dentro SavingData.cppm e adicione uma nova instrução caso dentro da seção WM_COMMAND para processar a opção de menu Salvar como . Chame a função OnFileSaveAs , que criará na próxima seção. Essa função assume sem parâmetros.

    Seu código deve aparecer da seguinte maneira:
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        case IDM_FILE_SAVEAS:
            OnFileSaveAs(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    

Use a padrão caixa de diálogo Salvar arquivo como padrão para o local correto

Quando um usuário exibe a caixa de diálogo Salvar arquivo (ou Abrir arquivo ) do aplicativo pela primeira vez, a caixa de diálogo deve padrão para a pasta Meus documentos do usuário (ou um descendente de Meus documentos, como Minhas imagens para dados de imagem e Minhas músicas para arquivos de áudio).

Observação : você deve código nunca rígido um caminho dentro do seu aplicativo porque você nunca pode garantir sua localização física. Por exemplo, um administrador pode realocar a pasta Meus documentos para um local de rede.
  1. Na parte superior de SavingData.cpp, adicione o seguinte incluir instruções:
    #include <commdlg.h>   // for GetSaveFileName
    #include <shlobj.h>    // for SHGetFolderPath
    					
  2. Adicione o seguinte protótipo para a função OnFileSaveAs :
    void OnFileSaveAs( HWND hWnd );
    					
  3. Crie a nova função OnFileSaveAs . Nessa função, use a função SHGetFolderPath em conjunto com o identificador CSIDL CSIDL_MYPICTURES para recuperar o local de pasta correta para armazenar dados de imagem. Passar esse local de pasta para a função GetSaveFileName para exibir o padrão Arquivo Salvar caixa de diálogo.

    Seu código deve aparecer da seguinte maneira:
    void OnFileSaveAs(HWND hWnd)
    {
       OPENFILENAME openFile;
       TCHAR szPath[MAX_PATH];
       TCHAR szFile[MAX_PATH];
    
        // Initialize OPENFILENAME structure.
        ZeroMemory( &openFile, sizeof(OPENFILENAME) );
        openFile.lStructSize = sizeof(OPENFILENAME);
    
        szFile[0] = '\0';
        openFile.hwndOwner = hWnd;
        openFile.lpstrFile = szFile;
        openFile.nMaxFile = sizeof(szFile)/sizeof(*szFile);
    
        // Default to My Pictures. First, get its path.
        if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_MYPICTURES, 
                                              NULL, 0, szPath ) ) )
        {
           // Set lpstrInitialDir to the path that SHGetFolderPath obtains. 
           // This causes GetSaveFileName to point to the My Pictures folder.
              openFile.lpstrInitialDir = szPath;
        }
        // Display the standard File Save dialog box, defaulting to My Pictures.
        if ( GetSaveFileName( &openFile ) == TRUE )
        {
            // User clicks the Save button.
            // Save the file
        }
        else
        {
           // User cancels the File Save dialog box.
        }
    }
    

Verifique se o arquivo correto Salvar local

  1. Pressione a tecla F5 para criar o projeto.
  2. Executar o aplicativo e clique em Salvar como no menu arquivo .
  3. Verifique se que a caixa de diálogo Salvar arquivo padrão assume o padrão para a pasta Minhas imagens, como CSIDL_MYPICTURES especifica.
  4. Clique em Cancelar para fechar a caixa de diálogo e feche o aplicativo.

Lembre-se seleção anterior do usuário

Para uso posterior da caixa de diálogo Salvar arquivo (ou Abrir arquivo ), é recomendável que o padrão de caixa de diálogo para o usuário tiver selecionado local anteriormente.

Se você não fornecer um local de pasta inicial dentro da estrutura OPENFILENAME , GetSaveFileName (e GetOpenFileName ) exibir a padrão Arquivo Salvar ou Abrir arquivo caixa de diálogo, que aponta para a pasta Meus documentos. Além disso, se o usuário tem uma das seguintes caixas de diálogo usado anteriormente e escolheu uma pasta não-padrão, essas funções automaticamente padrão para a pasta usada anteriormente.

Para oferecer suporte a prática recomendada de direcionamento de um local de pasta específica (como Minhas imagens) na primeira vez em que um usuário salva ou carrega um arquivo e subseqüentemente padrão para o local selecionado anteriormente do usuário, você deve usar uma variável Boolean para controlar se esta for a primeira vez que o usuário executou a operação abrir ou salvar.
  1. Crie uma variável estática BOOL chamada bFirstSave na função OnFileSaveAs e inicializá-lo como TRUE .
  2. Modificar o código OnFileSaveAs para chamar SHGetFolderPath e definir o membro lpstrInitialDir da estrutura OPENFILENAME , somente se bFirstSave for Verdadeiro .
  3. Se o usuário clicar em Salvar na caixa de diálogo File Save , defina bFirstSave como FALSE .

    Seu código deve aparecer da seguinte maneira:
    void OnFileSaveAs(HWND hWnd)
    {
        OPENFILENAME openFile;
        TCHAR szPath[MAX_PATH];
        TCHAR szFile[MAX_PATH];
        static BOOL bFirstSave = TRUE;
    
        // Initialize OPENFILENAME structure.
        ZeroMemory( &openFile, sizeof(OPENFILENAME) );
        openFile.lStructSize = sizeof(OPENFILENAME);
    
        szFile[0] = '\0';
        openFile.hwndOwner = hWnd;
        openFile.lpstrFile = szFile;
        openFile.nMaxFile = sizeof(szFile)/sizeof(*szFile);
    
        // The first time the user saves a document, default to My Pictures.
        if ( TRUE == bFirstSave )
        {
            if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_MYPICTURES, 
                NULL, 0, szPath ) ) )
            {
                // Set lpstrInitialDir to the path that SHGetFolderPath obtains.
                // This causes GetSaveFileName to point to the My Pictures folder.
                openFile.lpstrInitialDir = szPath;
            }
        }
        // Display standard File Save dialog box, defaulting to My Pictures
        // or the user's previously selected location.
        if ( GetSaveFileName( &openFile ) == TRUE )
        {
            // User clicks Save.
            // Save the file.
            bFirstSave = FALSE;
        }
        else
        {
            // User cancels the File Save dialog box.
        }
    }
    

Verifique se a seleção anterior do usuário

  1. Compile o projeto e execute o aplicativo.
  2. No menu arquivo , clique em Salvar como .
  3. Navegar a partir da pasta Minhas imagens para Meus documentos pasta, selecione um arquivo e clique em Salvar .
  4. No menu arquivo , clique em Salvar como novamente.
  5. Verifique se que a caixa de diálogo assume o padrão sua seleção anterior (neste caso, Meus documentos).
  6. Clique em Cancelar para descartar a caixa de diálogo e feche o aplicativo.
  7. Executar o aplicativo e clique em Salvar como no menu arquivo .
  8. Verifique se que a caixa de diálogo assume o padrão para Minhas imagens pasta.
  9. Fechar a caixa de diálogo e feche o aplicativo.

Classificar dados de aplicativos

Você não deve armazenar dados específicos do aplicativo (como arquivos temporários, as preferências do usuário, arquivos de configuração do aplicativo e assim por diante) na pasta Meus documentos. Em vez disso, use um local apropriado no registro do Windows (para dados que não excedam 64 quilobytes) ou um arquivo específico do aplicativo que está localizado em uma data de aplicativo válido pasta.

É importante armazenar dados de aplicativo no local correto para permitir que várias pessoas usam o mesmo computador sem danificar ou substituir uns dos outros dados e configurações.

Para determinar o local mais adequado para seus dados de aplicativo, use as seguintes categorias para classificar seus dados:
  • para cada usuário (roaming) : esta categoria descreve os dados de aplicativo que são específico para um usuário específico e devem estar disponíveis para o usuário como ele ou ela move entre computadores em um domínio (por exemplo, um dicionário personalizado). Observe que essa configuração não se aplica a aplicativos que não são projetados para serem executados em um ambiente de domínio.
  • para cada usuário (não roaming) : esta categoria descreve os dados de aplicativo que são específico para um determinado usuário, mas só se aplica a um único computador (por exemplo, uma resolução de monitor especificado pelo usuário).
  • para cada computador (não-usuário específico e não móveis) : esta categoria descreve dados do aplicativo que se aplica a todos os usuários e a um computador específico (por exemplo, um dicionário de aplicativo, um arquivo de log ou um arquivo temporário).

Armazenar dados de aplicativos no local correto

Você usar a função SHGetFolderPath para recuperar a pasta Application Data correta. Não armazene dados do aplicativo diretamente nesta pasta. Em vez disso, use a função PathAppend para acrescentar o caminho que SHGetFolderPath retorna uma subpasta. Certifique-se de que usar a seguinte convenção:
Empresa Name\Product Name\Product versão
Por exemplo, o caminho completo resultante pode aparecer da seguinte maneira:
\Documents and Settings\All Users\Application Data\My Company\My Product\1.0
Para localizar a pasta Application Data correta, passe o valor CSIDL apropriado, com base na categoria de seus dados de aplicativos.
  • Para cada usuário (móveis) dados, use o valor CSIDL_APPDATA . Esse padrão para o seguinte caminho:
    \Documents and Settings\ < nome de usuário > \Application Data
  • Para cada usuário (não roaming) de dados, use o valor CSIDL_LOCAL_APPDATA . Esse padrão para o seguinte caminho:
    \Documents and Settings\ < nome de usuário > \Local Settings\Application dados
  • Para cada computador (não-usuário específico e não móveis) de dados, use o valor CSIDL_COMMON_APPDATA . Esse padrão para o seguinte caminho:
    \Documents and Settings\All Users\dados
O fragmento de código a seguir demonstra como abrir um arquivo de log temporário, que está localizado abaixo CSIDL_COMMON_APPDATA :
include <shlwapi.h>
#pragma comment(lib,"shlwapi.lib")
void CreateTemporaryFile()
{
   TCHAR szPath[MAX_PATH];
   // Get path for each computer, non-user specific and non-roaming data.
   if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_COMMON_APPDATA, 
                                    NULL, 0, szPath ) ) )
   {
      TCHAR szTempFileName[MAX_PATH];
      // Append product-specific path - this path needs to already exist
      // for GetTempFileName to succeed.
      PathAppend( szPath, _T("\\My Company\\My Product\\1.0\\") );
      // Generate a temporary file name within this folder.
      if (GetTempFileName( szPath, 
                           _T("PRE"),
                           0,
                           szTempFileName ) != 0 )
      {
         HANDLE hFile = NULL;
         // Open the file.
         if (( hFile = CreateFile( szTempFileName, 
                                   GENERIC_WRITE, 
                                   0, 
                                   NULL, 
                                   CREATE_ALWAYS, 
                                   FILE_ATTRIBUTE_NORMAL, 
                                   NULL )) != INVALID_HANDLE_VALUE )
         {
            // Write temporary data (code omitted).
            CloseHandle( hFile );
         }
      }
      else
          DWORD err = GetLastError();
   }
}

Usar o registro criteriosamente

importante Esta seção, método ou tarefa contém etapas que informam sobre como modificar o registro. No entanto, sérios problemas poderão ocorrer se você modificar o registro incorretamente. Por isso, certifique-se que você execute essas etapas cuidadosamente. Para proteção adicional, fazer backup do registro antes de modificá-lo. Em seguida, você pode restaurar o registro se ocorrer um problema. Para obter mais informações sobre como fazer backup e restaurar o registro, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
322756  (http://support.microsoft.com/kb/322756/ ) Como fazer backup e restaurar o registro no Windows

Você também pode usar o registro para armazenar pequenas quantidades de dados do aplicativo. Para dados que excedem 64 kilobytes (KB), você deve usar uma pasta de dados de aplicativos. Observe as diretrizes a seguir quando você usa o registro para armazenar dados de aplicativo:
  • Para pequenas quantidades de dados do usuário, use a chave de registro HKEY_CURRENT_USER ( HKCU ).
  • Para pequenas quantidades de dados do computador, use a chave de registro HKEY_LOCAL_MACHINE ( HKLM ). Seu aplicativo não deve gravar no HKLM em tempo de execução porque, por padrão, os usuários não-administrador só têm acesso somente leitura à árvore de HKLM .
  • No momento da instalação, seu aplicativo deve não armazenar mais de um total de 128 KB em HKCU e HKLM .
  • Componente componentes de modelo de objeto (COM) estão registrados sob a chave de registro HKEY_CLASSES_ROOT ( HKCR ). O máximo de 128 KB não inclui HKCR .
  • Ao gravar em HKLM ou HKCU , você deve criar teclas para o nome da empresa, nome do produto e número de versão do produto, da seguinte maneira:
    HKLM\Software\Company Name\Product Name\Product versão
    HKCU\Software\Company Name\Product Name\Product versão
  • Use as funções do Registro (como RegCreateKeyEx e RegSetValueEx ) para ler e gravar entradas do Registro.

Solução de problemas

  • Para ajudar a garantir que aplicativos executados em versões anteriores do Windows ao Windows XP, sempre link para a implementação de SHGetFolderPath no shfolder.dll. Embora o Windows XP inclui SHGetFolderPath em Shell32.dll, as versões anteriores do Windows talvez não ofereçam suporte a função dentro dessa biblioteca de vínculo dinâmico (DLL).
  • Shfolder.dll é um componente redistribuível e pode ser distribuído com seus aplicativos.
  • Não armazenar caminhos totalmente qualificados para Meus documentos pasta (ou outras pastas do sistema) em um local específico do aplicativo como uma lista de arquivo da maioria arquivos usados recentemente porque um usuário ou um administrador pode realocar essas pastas entre usa sucessivas de seu aplicativo.

Referências

Para outros superior-impacto Visual C++ .NET Microsoft Knowledge Base artigos, visite o Visual C++ .NET Support Center no site da Microsoft:
O Visual C++ .NET (2002) Support Center
http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet (http://support.microsoft.com/default.aspx?xmlid=fh%3ben-us%3bvcnet)
Para obter informações mais gerais sobre o Visual C++ .NET, visite o seguinte grupo de notícias Usenet da Microsoft:
Microsoft.public.dotnet.languages.vc (http://msdn.microsoft.com/newsgroups/default.aspx?query=Microsoft.public.dotnet.languages.vc&dg=&cat=en-us-msdn&lang=en&cr=US&pt=&catlist=774F24A2-F71F-425F-AC2B-DC48AB0DA5C9&dglist=&ptlist=&exp=&sloc=en-us)
Para obter mais informações sobre o conjunto completo de pastas SHGetFolderPath pode identificar, consulte o seguinte Microsoft Platform Software documentação Development Kit (SDK):
CSIDL
http://msdn.microsoft.com/en-us/library/bb762494.aspx (http://msdn.microsoft.com/en-us/library/bb762494.aspx)
Para obter mais informações sobre programação do shell em geral, consulte a seguinte site da Microsoft Developer Network (MSDN):
Guia de programadores do shell
http://msdn2.microsoft.com/en-us/library/bb776778.aspx (http://msdn2.microsoft.com/en-us/library/bb776778.aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition nas seguintes plataformas
    • the operating system: Microsoft Windows XP
  • Microsoft Visual C++ .NET 2002 Standard Edition nas seguintes plataformas
    • the operating system: Microsoft Windows XP
Palavras-chave: 
kbmt kbhowtomaster kbnewsgrouplink KB310294 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 310294  (http://support.microsoft.com/kb/310294/en-us/ )