Como escrever uma aplicação do Windows XP que armazena dados de utilizador e a aplicação na localização correcta, utilizando o Visual C++

Traduções de Artigos Traduções de Artigos
Artigo: 310294 - Ver produtos para os quais este artigo se aplica.
Importante Este artigo contém informações sobre como modificar o registo. Certifique-se de que crie uma cópia de segurança do registo antes de o modificar. Certifique-se de que sabe como restaurar o registo se ocorrer um problema. Para mais informações sobre como efectuar cópias de segurança, restaurar e modificar o registo, clique no número de artigo seguinte para visualizar o artigo na Microsoft Knowledge Base:
322756 Como efectuar cópias de segurança e restaurar o registo no Windows
Nota Microsoft Visual C++ .NET 2002, Microsoft Visual C++ .NET 2003, Microsoft Visual C++ 2005 e Microsoft Visual C++ 2008 suportam o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido. As informações neste artigo só se aplica ao código de Visual C++ não gerido
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Aplicações funcionam com dois tipos de documentos: essas que o utilizador cria e os que cria a aplicação. As aplicações deve utilizar a função de shell SHGetFolderPath para obter localizações de pasta válida para armazenar dados que é específico do utilizador e a aplicação. Isto é essencial para o Windows Aplicações do XP para suportar vários utilizadores que utilizam o mesmo computador e para permitir aos utilizadores mudar rapidamente.

Este artigo descreve como armazene dados de utilizador no local correcto nos passos seguintes:
  • Crie uma aplicação de Win32.
  • Adicionar um Guardar como a opção para oFicheiro menu.
  • Utilizar o padrão Guardar ficheiro caixa de diálogo para predefinição para a localização correcta.
  • Verifique se o ficheiro correcto localização para guardar.
  • Lembre-se a selecção anterior do utilizador.
  • Verifique se a selecção anterior do utilizador.
Nos passos seguintes, este artigo também descreve onde lhe tem de armazenar dados da aplicação e como garantir que está armazenado na localizações adequadas:
  • Classificar os dados da aplicação.
  • Armazenar dados da aplicação na localização correcta.
  • Utilize o registo de forma sensata.

Requisitos

A lista seguinte descreve o hardware recomendado, software, rede de infra-estrutura, qualificações, conhecimentos e service packs que necessita:
  • Windows XP Home Edition ou Windows XP Professional
  • Visual Studio 2008, o Visual Studio 2005 ou o Visual Studio .NET.
  • Conhecimento prévio da programação de aplicações do Win32

Criar uma aplicação de Win32

Inicie o Visual Studio e criar uma nova aplicação de Win32 com o nome SavingData.
  • No Visual Studio .NET, clique em Visual C++ Projectos em Tipos de projectoe, em seguida, clique emProjecto Win32 em Modelos. Aceitar a definições de aplicação predefinidas que a aplicação de Assistente de configuração Apresenta.
  • No Visual Studio 2005 ou 2008, clique em Visual C++em Tipos de projectoe, em seguida, clique em Win32 Projecto em Modelos. Aceite a predefinição definições da aplicação.

Adicionar um guardar como opção de Menu ficheiro

  1. Clique em Vista de recursose, em seguida, faça duplo clique IDC_SAVINGDATA.
  2. Adicionar um Guardar como opção de menu para oFicheiro menu. Utilize IDM_FILE_SAVEAS como o ID do item de menu.
  3. Localizar o procedimento de janela de pedido de WndProc SavingData.cppm e adicionar uma nova instrução de caso da secção de WM_COMMAND para processar o Guardar como opção de menu. Chamada a função de OnFileSaveAs , que criou na secção seguinte. Isto função não tem parâmetros.

    O código deve ser apresentado da seguinte forma:
    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;
    

Utilizar o ficheiro guardar caixa de diálogo padrão predefinida para a localização correcta

Quando um utilizador apresenta uma aplicação Guardar ficheiro(ou Ficheiro aberto) a caixa de diálogo pela primeira vez, a caixa de diálogo deve predefinir para a pasta Os meus documentos do utilizador (ou um descendente de meu Documentos, tais como as minhas imagens de dados de imagem e a minha música para áudio ficheiros).

Nota: tem código nunca rígido um caminho na aplicação porque nunca pode garantir a respectiva localização física. Por exemplo, um administrador Pode reposicionar a pasta Os meus documentos para uma localização de rede.
  1. Na parte superior de SavingData.cpp, adicionar o campo ' incluir seguinte demonstraçõ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 de OnFileSaveAs . Através desta função, utilize a função de SHGetFolderPath em conjunto com o identificador CSIDLCSIDL_MYPICTURES para obter a localização de pasta correcto para armazenar dados da imagem. Passar esta localização da pasta para a função de GetSaveFileName para apresentar o padrão Guardar ficheirocaixa de diálogo.

    O código deve ser apresentado da seguinte forma:
    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 ficheiro correcto localização para guardar

  1. Prima a tecla F5 para compilar o projecto.
  2. Execute a aplicação e clique em Guardar comopartir o Ficheiro menu.
  3. Verifique se o padrão Guardar ficheiro diálogo caixa predefinições para a pasta as minhas imagens, tal como especifica CSIDL_MYPICTURES .
  4. Clique em Cancelar para fechar a caixa de diálogo, e Feche a aplicação.

Lembre-se de selecção anterior o utilizador

Para utilização posterior das Guardar ficheiro (ou Ficheiro aberto) caixa de diálogo, é recomendável que a caixa de diálogo a predefinição para o utilizador seleccionado anteriormente a localização.

Se não o fizer Indique uma localização de pasta inicial dentro da estrutura NOMEDOFICHEIROABERTO , GetSaveFileName (e GetOpenFileName) apresentam o padrão Guardar ficheiro ou Ficheiro Abrir caixa de diálogo que aponta para a pasta Os meus documentos. Além disso, Se o utilizador utilizou uma destas caixas de diálogo anteriormente e que tenha escolhido um pasta não predefinida, estas funções automaticamente a predefinição a anteriormente pasta utilizada.

Para suportar a melhor prática recomendada de filtragem de um localização da pasta específica (por exemplo, as minhas imagens) pela primeira vez que um utilizador guarda ou carrega um ficheiro e subsequentemente predefinido para o utilizador seleccionado anteriormente localização, deve utilizar uma variável booleana para controlar se é este o primeiro hora em que o utilizador ter executado a operação de abrir ou guardar.
  1. Criar uma variável BOOL estático com o nome bFirstSave na função OnFileSaveAs e inicializá-lo como TRUE.
  2. Modificar o código de OnFileSaveAs a SHGetFolderPath de chamada e definir o membro lpstrInitialDir da estrutura NOMEDOFICHEIROABERTO , apenas se bFirstSave for verdadeira.
  3. Se o utilizador clica em Guardar noGuardar ficheiro caixa de diálogo, definir bFirstSave paraFALSO.

    O código deve ser apresentado da seguinte forma:
    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 de selecção anterior o utilizador

  1. Criar o projecto e executar a aplicação.
  2. Partir o Ficheiro menu, clique em Guardar Como.
  3. Navegar a partir da pasta as minhas imagens para os meus documentos pasta, seleccione um ficheiro e clique em Guardar.
  4. Partir o Ficheiro menu, clique em Guardar Como novamente.
  5. Certifique-se de que a caixa de diálogo as predefinições para a anterior selecção (neste caso, os meus documentos).
  6. Clique em Cancelar para fechar a caixa de diálogo e feche a aplicação.
  7. Execute a aplicação e clique em Guardar comopartir o Ficheiro menu.
  8. Certifique-se de que a caixa de diálogo as predefinições para as minhas imagens pasta.
  9. Feche a caixa de diálogo e sair da aplicação.

Classificação dos dados da aplicação

Não deve armazenar dados específicos da aplicação (por exemplo, temporário ficheiros, as preferências do utilizador, ficheiros de configuração da aplicação e assim sucessivamente) no meu Pasta de documentos. Em alternativa, utilize uma localização de apropriada no Windows Registo (para os dados que não excede os 64 kilobytes) ou um ficheiro específico da aplicação que está localizado um pedido de dados válido pasta.

É importante armazenar dados de aplicação correcto localização para permitir que várias pessoas utilizarem o mesmo computador sem danificar ou substituição de dados e definições de cada um dos outros.

Para determinar o maior localização para os dados da aplicação o caso, utilize as seguintes categorias para classificar os dados:
  • Para cada utilizador (roaming): esta categoria descreve dados da aplicação específica para um utilizador específico e devem estar disponíveis ao utilizador como ele ou ela se move entre computadores num domínio (por exemplo, um dicionário personalizado). Nota Se este definição não se aplica a aplicações que não foram concebidas para funcionar num domínio ambiente.
  • Para cada utilizador (não itinerantes): esta categoria descreve dados da aplicação específica para um utilizador específico mas só se aplica a um único computador (por exemplo, um resolução de monitor especificado pelo utilizador).
  • Para cada computador (não utilizadores específicos e não guardado no servidor): esta categoria descreve dados de aplicação que se aplicam a todos os utilizadores e para um computador específico (por exemplo, um dicionário de aplicação, um registo ficheiro ou um ficheiro temporário).

Armazenar dados da aplicação na localização correcta

Utilize a função SHGetFolderPath para obter a pasta Application Data correcta. Não armazene dados da aplicação directamente nesta pasta. Em vez disso, utilize a função PathAppend para acrescentar uma subpasta para o caminho que SHGetFolderPath devolve. Certifique-se de que utilize a seguinte convenção:
Versão de Name\Product de Name\Product de empresa
Por exemplo, o caminho completo resultante pode aparecer da seguinte forma:
\Documents and Settings\All Users\Application Data\My Company\My Product\1.0
Para localizar a pasta de dados da aplicação correcta, passar a CSIDL valor apropriado, com base na categoria dos dados da aplicação.
  • Para cada utilizador (roaming) de dados, utilize o valor CSIDL_APPDATA . Assume como predefinição para o seguinte caminho:
    \Documents and Settings \nome de utilizador> dados \Application
  • Para cada utilizador (não itinerantes) dados, utilize o valor CSIDL_LOCAL_APPDATA . Assume como predefinição para o seguinte caminho:
    \Documents and Settings \nome de utilizador> Settings\Application dados
  • Para dados de cada computador (não utilizadores específicos e não guardado no servidor), Utilize o valor CSIDL_COMMON_APPDATA . Assume como predefinição para o seguinte caminho:
    \Documents and Settings\All Users\Application dados
O seguinte fragmento de código demonstra como abrir um registo ficheiro temporário, que se encontra por baixo da 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();
   }
}

Utilizar o registo de forma sensata

Importante Esta secção, método ou tarefa contém passos que explicam como modificar o registo. No entanto, podem ocorrer problemas graves se modificar o registo incorrectamente. Por conseguinte, certifique-se de que segue estes passos cuidadosamente. Para obter protecção acrescentada, cópia do registo antes de o modificar. Em seguida, pode restaurar o registo se ocorrer um problema. Para mais informações sobre como efectuar cópias de segurança e restaurar o registo, clique no número de artigo seguinte para visualizar o artigo na Microsoft Knowledge Base:
322756 Como efectuar cópias de segurança e restaurar o registo no Windows

Também pode utilizar o registo para armazenar pequenas montantes dos dados da aplicação. Para os dados que excede os 64 kilobytes (KB), tem de Utilize uma pasta de dados da aplicação. Observar as seguintes directrizes quando utilizar o registo para armazenar dados da aplicação:
  • Para pequenas quantidades de dados do utilizador, utilize a chave de registo HKEY_CURRENT_USER (HKCU).
  • Para pequenas quantidades de dados do computador, utilize a chave de registo HKEY_LOCAL_MACHINE (HKLM). A aplicação deve não escrever HKLM em tempo de execução porque, por predefinição, apenas a utilizadores não-administrador ter acesso só de leitura à árvore de HKLM .
  • No momento da instalação, a aplicação não deve armazenar mais que um total de 128 KB em HKCU e HKLM.
  • Componentes do Component Object Model (COM) são registados abaixo da chave do registo HKEY_CLASSES_ROOT (HKCR). O máximo de 128 KB não inclui HKCR.
  • Quando escreve HKLM ou HKCU, tem de criar chaves para o nome da empresa, nome do produto, e número de versão de produto, da seguinte forma:
    Versão do HKLM\Software\Company Name\Product Name\Product
    Versão do HKCU\Software\Company Name\Product Name\Product
  • Utilize as funções de registo (como RegCreateKeyEx e RegSetValueEx) para ler e escrever entradas de registo.

Resolução de problemas

  • Para ajudar a garantir que as aplicações executadas em versões anteriores do Windows, para além do Windows XP, sempre ligar a implementação de SHGetFolderPath no Shfolder.dll. Embora o Windows XP inclui SHGetFolderPath no ficheiro Shell32. dll, versões anteriores do Windows poderão não suportar o função no âmbito desta biblioteca de ligação dinâmica (DLL).
  • Shfolder.dll é um componente redistribuível e poderá ser distribuído com as aplicações.
  • Não armazenar caminhos totalmente qualificados para os meus documentos pasta (ou outras pastas de sistema) dentro de uma aplicação específica colocar tal como um lista de ficheiros da maioria ficheiros utilizados recentemente uma vez que um utilizador ou administrador pode reposicionar estas pastas entre utilizações sucessivas da aplicação.

Referências

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

Propriedades

Artigo: 310294 - Última revisão: 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 por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
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