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

Traduções deste artigo Traduções deste artigo
ID do artigo: 310294 - Exibir os produtos aos quais esse artigo se aplica.
Importante Este artigo contém informações sobre como modificar o registro. Certifique-se de fazer backup do registro antes de modificá-lo. Certifique-se de que você saiba 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 de artigo que se segue para visualizar o artigo na Base de dados de Conhecimento Microsoft:
322756 Como fazer backup e restaurar o registro no Windows
Observação Microsoft Visual C++ .NET 2002, o Microsoft Visual C++ .NET 2003, o Microsoft Visual C++ 2005 e o Microsoft Visual C++ 2008 suportam o modelo de código gerenciado que é fornecido com o Microsoft.NET Framework e o modelo de código de Microsoft Windows nativo não gerenciado. As informações neste artigo se aplica somente a código não gerenciado do Visual C++
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Aplicativos funcionam com dois tipos de documentos: aqueles que o usuário cria e aqueles que o aplicativo cria. Seus aplicativos deve usar a função de shell SHGetFolderPath para recuperar os locais de pasta válido para armazenar dados que é específico para o usuário e o aplicativo. Isso é essencial para o Windows Aplicativos do XP para oferecer suporte a vários usuários que estão usando o mesmo computador e para permitir aos usuários alternar rapidamente.

Este artigo descreve como armazene dados de usuário no lugar correto nas etapas a seguir:
  • Crie um aplicativo Win32.
  • Adicionar um Salvar como opção para oArquivo menu.
  • Use o padrão Salvar arquivo caixa de diálogo 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 está armazenado na locais apropriados:
  • Classificar os dados de aplicativo.
  • Armazenar dados de aplicativo no local correto.
  • Use o registro criteriosamente.

Requisitos

A lista seguinte descreve o hardware recomendado, software, Conhecimento, habilidades, infra-estrutura de rede e service packs necessários:
  • Windows XP Home Edition ou Windows XP Professional
  • Visual Studio 2008, o Visual Studio 2005 ou 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 Visual C++ Projetos em Tipos de projetoe, em seguida, clique emProjeto Win32 em Modelos. Aceite o Assistente de configuração do aplicativo de configurações de aplicativo padrão Exibe.
  • No Visual Studio 2005 ou 2008, clique em Visual C++em Tipos de projetoe, em seguida, clique em Win32 Projeto em Modelos. Aceite o padrão configurações do aplicativo.

Adicionar um salvamento como opção para o Menu arquivo

  1. Clique em Modo de exibição de recursoe, em seguida, clique duas vezes em IDC_SAVINGDATA.
  2. Adicionar um Salvar como opção de menu para oArquivo menu. Use IDM_FILE_SAVEAS como a ID do item de menu.
  3. Localize o procedimento de janela do aplicativo WndProc dentro de SavingData.cppm e adicione uma instrução case novo dentro da seção WM_COMMAND para processar o Salvar como opção do menu. Chamada a função OnFileSaveAs , que você irá criar na próxima seção. Isso função não usa nenhum parâmetro.

    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 padrão para o local correto

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

Observação: você deve nunca codificar um caminho dentro de seu aplicativo porque Você nunca pode garantir sua localização física. Por exemplo, um administrador pode realocar a pasta Meus documentos em um local de rede.
  1. Na parte superior do SavingData.cpp, adicione o seguinte incluem instruções:
    #include <commdlg.h>   // for GetSaveFileName
    #include <shlobj.h>    // for SHGetFolderPath
    					
  2. Adicione o seguinte protótipo da 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 CSIDLCSIDL_MYPICTURES para recuperar o local correto da pasta para armazenar dados de imagem. Passar neste local de pasta para a função GetSaveFileName para exibir o padrão Salvar arquivocaixa 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 local de salvamento

  1. Pressione a tecla F5 para construir o projeto.
  2. Execute o aplicativo e, em seguida, clique em Salvar comoda Arquivo menu.
  3. Verifique o padrão Salvar arquivo diálogo caixa padrão é 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 de seleção anterior do usuário

Para uso subseqüente das Salvar arquivo (ou Abrir arquivo) caixa de diálogo, recomenda-se que a caixa de diálogo padrão para o usuário selecionado anteriormente local.

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

Para oferecer suporte a prática recomendada de direcionamento de um local de pasta específica (por exemplo, Minhas imagens) na primeira vez que um usuário salva ou carrega um arquivo e, subseqüentemente, o padrão do usuário selecionado anteriormente local, você deve usar uma variável Boolean para controlar se este é o primeiro hora em que o usuário executou a operação de abertura 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 NOMEDOARQUIVOABERTO , somente se bFirstSave for TRUE.
  3. Se o usuário clicar em Salvar naSalvar arquivo caixa de diálogo, conjunto bFirstSave paraFALSE.

    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 do usuário anterior

  1. Compile o projeto e executar o aplicativo.
  2. Da Arquivo menu, clique em Salvar Como.
  3. Procurar a partir da pasta Minhas imagens em Meus documentos pasta, selecione um arquivo e clique em Salvar.
  4. Da Arquivo menu, clique em Salvar Como novamente.
  5. Verifique se que a caixa de diálogo assume o padrão para o anterior seleção (no caso, Meus documentos).
  6. Clique em Cancelar para descartar a caixa de diálogo e feche o aplicativo.
  7. Execute o aplicativo e, em seguida, clique em Salvar comoda Arquivo menu.
  8. Verifique se a caixa de diálogo padrões de volta para Minhas imagens pasta.
  9. Feche a caixa de diálogo e sai do aplicativo.

Classificar os dados de aplicativo

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

É importante armazenar dados de aplicativo em correta local para permitir que várias pessoas usem o mesmo computador sem corromper ou sobrescrevendo dados e configurações do outro.

Para determinar o máximo apropriado local para dados do seu aplicativo, use as seguintes categorias para classificar os dados:
  • Para cada usuário (roaming): esta categoria descreve os dados de aplicativo que são específicos para um usuário específico e devem estar disponíveis para o usuário enquanto ele se move entre computadores em um domínio (por exemplo, um dicionário personalizado). Observe que isso configuração não se aplica a aplicativos que não são projetados para executar em um domínio ambiente.
  • Para cada usuário (não roaming): esta categoria descreve os dados de aplicativo que são específicos para um usuário específico mas só se aplica a um único computador (por exemplo, um 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 os dados de aplicativo que se aplica a todos os os usuários e para um computador específico (por exemplo, um dicionário de aplicativo, um log arquivo ou um arquivo temporário).

Armazenar dados de aplicativo no local correto

Use a função SHGetFolderPath para recuperar a pasta Application Data correta. Não armazene dados do aplicativo diretamente na pasta. Em vez disso, use a função PathAppend para acrescentar uma subpasta no caminho SHGetFolderPath retorna. Certifique-se de que você use a seguinte convenção:
Versão de Name\Product de Name\Product de empresa
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, passar o valor CSIDL apropriado, com base na categoria dos dados do aplicativo.
  • Para cada usuário (roaming) de dados, use o valor CSIDL_APPDATA . Esse padrão é o caminho a seguir:
    \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 é o caminho a seguir:
    \Documents and Settings \nome de usuário> Settings\Application Data
  • Para cada dados de computador (não-usuário específico e não móveis), Use o valor CSIDL_COMMON_APPDATA . Esse padrão é o caminho a seguir:
    \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 de 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 Essa 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. Portanto, certifique-se de que segue estes passos cuidadosamente. Para obter mais proteção, faça backup do registro antes de modificá-lo. Em seguida, você poderá restaurar o registro se ocorrer um problema. Para obter mais informações sobre como fazer backup e restaurar o registro, clique no número de artigo que se segue para visualizar o artigo na Base de dados de Conhecimento Microsoft:
322756 Como fazer backup e restaurar o registro no Windows

Você também pode usar o registro para armazenar pequenas quantidades de dados de aplicativo. Para dados que excede 64 quilobytes (KB), você deve Use uma pasta de dados do aplicativo. Observe as seguintes diretrizes ao usar 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 escrever em HKLM em tempo de execução porque, por padrão, somente usuários não-administrador tem acesso somente leitura à árvore de HKLM .
  • No momento da instalação, o aplicativo não deve armazenar mais de um total de 128 KB em HKCU e HKLM.
  • Componentes do Component Object Model (COM) são registrados abaixo da 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 chaves para o nome da empresa, nome do produto, e número de versão de produto, da seguinte maneira:
    Versão de Name\Product de Name\Product de HKLM\Software\Company
    Versão de Name\Product de Name\Product de HKCU\Software\Company
  • 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 os aplicativos executados em versões anteriores do Windows além do Windows XP, sempre vincular a implementação SHGetFolderPath shfolder. Embora o Windows XP inclui SHGetFolderPath em Shell32. dll, versões anteriores do Windows podem não oferecer suporte a função dentro dessa biblioteca de vínculo dinâmico (DLL).
  • Shfolder é 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) dentro de um aplicativo específico, como colocar um lista de arquivos de arquivos usados recentemente porque um usuário ou administrador pode realocar essas pastas entre as utilizações sucessivas de seu aplicativo.

Referências

Para outros acertos superior Base de Conhecimento Microsoft do Visual C++ .NET artigos, visite o Centro de suporte do Visual C++ .NET da Microsoft a seguir Site da Web:
Centro de suporte do Visual C++ .NET (2002)
http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet
Para obter mais informações sobre o conjunto completo de pastas SHGetFolderPath pode identificar, consulte o seguinte Software de plataforma Microsoft Documentação do Development Kit (SDK):
CSIDL
http://msdn.microsoft.com/en-us/library/bb762494.aspx
Para obter mais informações sobre a programação de shell em geral, consulte o seguinte Web site da Microsoft Developer Network (MSDN):
Guia dos programadores de shell
http://msdn2.microsoft.com/en-us/library/bb776778.aspx

Propriedades

ID do artigo: 310294 - Última revisão: sábado, 20 de julho de 2013 - Revisão: 4.0
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
  • Microsoft Visual C++ .NET 2002 Standard Edition
Palavras-chave: 
kbhowtomaster kbnewsgrouplink kbmt KB310294 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.
Clique aqui para ver a versão em Inglês deste artigo: 310294

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com