Creazione di un'applicazione per Windows XP che consenta la memorizzazione dei dati dell'utente e dell'applicazione nei percorsi corretti utilizzando Visual C++ 2005 o Visual C++ .NET

Traduzione articoli Traduzione articoli
Identificativo articolo: 310294 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo Ŕ stato precedentemente pubblicato con il codice di riferimento I310294
IMPORTANTE: in questo articolo vengono fornite informazioni su come modificare il Registro di sistema. Prima di modificare il Registro di sistema, eseguire una copia di backup e assicurarsi di sapere come ripristinarlo in caso di problemi. Per ulteriori informazioni su come eseguire il backup, ripristinare e modificare il Registro di sistema, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
256986 Descrizione del Registro di sistema di Microsoft Windows
Nota In Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2002 e Microsoft Visual C++ sono supportati sia il modello di codice gestito fornito con Microsoft .NET Framework che il modello di codice non gestito nativo di Microsoft Windows. Le informazioni contenute in questo articolo si applicano solo al codice Visual C++ non gestito.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Le applicazioni interagiscono con due tipi di documenti: quelli creati dall'utente e quelli creati dall'applicazione. Le applicazioni dovranno utilizzare la funzione SHGetFolderPath per recuperare i percorsi di cartelle valide in cui memorizzare i dati specifici dell'utente e dell'applicazione. Questo Ŕ un aspetto essenziale per le applicazioni per Windows XP se si desidera supportare l'utilizzo dello stesso computer da parte di pi¨ utenti e consentire agli utenti di cambiare sessione rapidamente.

Nei seguenti passaggi di questo articolo viene descritto come memorizzare i dati utente nel percorso corretto:
  • Creazione di un'applicazione Win32.
  • Aggiunta di un'opzione Salva con nome al menu File.
  • Utilizzo della finestra di dialogo di salvataggio dei file standard per passare al percorso predefinito corretto.
  • Verifica del percorso di salvataggio del file corretto.
  • Memorizzazione della precedente selezione dell'utente.
  • Verifica della precedente selezione dell'utente.
Nei seguenti passaggi viene inoltre descritto in quale percorso Ŕ necessario memorizzare i dati dell'applicazione e come assicurare che vengano salvati nei percorsi corretti:
  • Classificazione dei dati dell'applicazione.
  • Memorizzazione dei dati dell'applicazione nel percorso corretto.
  • Utilizzo del Registro di sistema con cautela.

Requisiti

Di seguito vengono indicati l'hardware, il software, l'infrastruttura di rete, le capacitÓ, le conoscenze e i service pack necessari:
  • Windows XP Home Edition o Windows XP Professional
  • Visual Studio 2005, Visual Studio .NET o Visual Studio versione 6.0
  • Conoscenza dello sviluppo di applicazioni Win32

Creazione di un'applicazione Win32

Avviare Visual Studio e creare una nuova applicazione Win32 con nome SavingData.
  • In Visual C++ 6.0 fare clic su Win32 Application dall'elenco di tipi di progetto disponibili, quindi selezionare l'opzione A typical "Hello World" application nella procedura di installazione guidata dell'applicazione.
  • In Visual Studio .NET fare clic su Progetti di Visual C++ in Tipi progetto, quindi scegliere Win32 Project in Modelli. Accettare le impostazioni predefinite dell'applicazione visualizzate nella procedura di installazione guidata dell'applicazione.
  • In Visual Studio 2005 fare clic su Visual C++ in Tipi progetto, quindi scegliere Win32 Project in Modelli. Accettare le impostazioni predefinite.

Aggiunta di un'opzione Salva con nome al menu File

  1. Scegliere Visualizzazione risorse, quindi fare doppio clic su IDC_SAVINGDATA.
  2. Aggiungere una voce Salva con nome al menu File. Utilizzare IDM_FILE_SAVEAS come ID della voce di menu.
  3. Individuare la routine della finestra WndProc dell'applicazione in SavingData.cppm e aggiungere una nuova istruzione case nella sezione WM_COMMAND per elaborare la voce di menu Salva con nome. Chiamare la funzione OnFileSaveAs che verrÓ creata nella sezione seguente. Questa funzione non accetta parametri.

    Il codice avrÓ il seguente aspetto:
    case WM_COMMAND:
       wmId    = LOWORD(wParam); 
       wmEvent = HIWORD(wParam); 
       // Parse the menu selections.
       switch (wmId)
       {
       case IDM_ABOUT:
          DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
          break;
       case IDM_EXIT:
          DestroyWindow(hWnd);
          break;
       case IDM_FILE_SAVEAS:
          OnFileSaveAs();
          break;
       default:
          return DefWindowProc(hWnd, message, wParam, lParam);
       }
       break;
    					

Utilizzo della finestra di dialogo di salvataggio del file standard per passare al percorso corretto predefinito

Quando un utente visualizza per la prima volta la finestra di dialogo relativa al salvataggio o all'apertura di un file di un'applicazione, nella finestra di dialogo dovrÓ essere visualizzata la cartella predefinita Documenti dell'utente o una sottocartella di Documenti, come Immagini per i dati di immagini e Musica per i file audio.

NOTA: non inserire mai nel codice un percorso all'interno dell'applicazione poichÚ non Ŕ mai possibile garantirne la posizione fisica. L'amministratore pu˛ ad esempio riposizionare la cartella Documenti in un percorso di rete.
  1. Nella parte superiore di SavingData.cpp aggiungere le seguenti istruzioni include:
    #include <commdlg.h>   // for GetSaveFileName
    #include <shlobj.h>    // for SHGetFolderPath
    					
  2. Aggiungere il seguente prototipo per la funzione OnFileSaveAs:
    void OnFileSaveAs();
    					
  3. Creare la nuova funzione OnFileSaveAs. All'interno di questa funzione utilizzare la funzione SHGetFolderPath insieme all'identificatore CSIDLCSIDL_MYPICTURES per recuperare il percorso della cartella corretta in cui memorizzare i dati dell'immagine. Passare questo percorso di cartella alla funzione GetSaveFileName per visualizzare la finestra di dialogo di salvataggio del file standard.

    Il codice avrÓ il seguente aspetto:
    void OnFileSaveAs()
    {
       OPENFILENAME openFile;
       TCHAR szPath[MAX_PATH];
    
    // Initialize OPENFILENAME structure.
    ZeroMemory( &openFile, sizeof(OPENFILENAME) );
    openFile.lStructSize = sizeof(OPENFILENAME);
    // 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.
    }
    }
    					

Verifica del percorso di salvataggio del file corretto

  1. Premere F5 per generare il progetto.
  2. Eseguire l'applicazione e scegliere Salva con nome dal menu File.
  3. Verificare che nella finestra di dialogo relativa al salvataggio del file sia visualizzata automaticamente la cartella predefinita Immagini, come specificato da CSIDL_MYPICTURES.
  4. Scegliere Annulla per chiudere la finestra di dialogo e l'applicazione.

Memorizzazione della precedente selezione dell'utente

Per l'uso successivo della finestra di dialogo relativa al salvataggio o all'apertura di un file, si consiglia di fare in modo che nella finestra di dialogo venga automaticamente visualizzato il percorso selezionato in precedenza dall'utente.

Se nella struttura OPENFILENAME non viene specificato un percorso di cartella iniziale, le funzioni GetSaveFileName e GetOpenFileName visualizzeranno la finestra di dialogo relativa al salvataggio o all'apertura del file standard che fa riferimento alla cartella Documenti. Inoltre, se l'utente ha utilizzato una di queste finestre di dialogo in precedenza e ha scelto una cartella non predefinita, queste funzioni consentiranno di passare automaticamente alla cartella utilizzata in precedenza.

Per supportare la procedura consigliata di utilizzare come destinazione una cartella specifica (come Immagini) la prima volta che un utente salva o carica un file e per passare in seguito automaticamente al percorso selezionato in precedenza dall'utente, utilizzare una variabile booleana per controllare se si tratta della prima operazione di salvataggio o apertura eseguita dall'utente.
  1. Creare una variabile static BOOL denominata bFirstSave nella funzione OnFileSaveAs, quindi inizializzarla su TRUE.
  2. Modificare il codice in OnFileSaveAs in modo che venga chiamata SHGetFolderPath e impostare il membro lpstrInitialDir della struttura OPENFILENAME solo se bFirstSave Ŕ TRUE.
  3. Se l'utente fa clic sul pulsante Salva nella finestra di dialogo di salvataggio del file, impostare bFirstSave su FALSE.

    Il codice avrÓ il seguente aspetto:
    void OnFileSaveAs()
    {
       OPENFILENAME openFile;
       TCHAR szPath[MAX_PATH];
       static BOOL bFirstSave = TRUE;
    
    // Initialize OPENFILENAME structure.
    ZeroMemory( &openFile, sizeof(OPENFILENAME) );
    openFile.lStructSize = sizeof(OPENFILENAME);
    // 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.
    }
    }
    					

Verifica della precedente selezione dell'utente

  1. Generare il progetto ed eseguire l'applicazione.
  2. Scegliere Salva con nome dal menu File.
  3. Passare dalla cartella Immagini alla cartella Documenti, selezionare un file e fare clic su Salva.
  4. Scegliere di nuovo Salva con nome dal menu File.
  5. Verificare che nella finestra di dialogo venga visualizzata automaticamente la cartella selezionata in precedenza, in questo caso Documenti.
  6. Scegliere Annulla per chiudere la finestra di dialogo e l'applicazione.
  7. Eseguire l'applicazione e scegliere Salva con nome dal menu File.
  8. Verificare che nella finestra di dialogo venga di nuovo visualizzata automaticamente la cartella Immagini.
  9. Chiudere la finestra di dialogo e uscire dall'applicazione.

Classificazione dei dati dell'applicazione

Evitare di memorizzare nella cartella Documenti dati specifici dell'applicazione, come file temporanei, preferenze dell'utente, file di configurazione dell'applicazione e cosý via. Utilizzare invece un percorso appropriato nel Registro di sistema di Windows (per i dati che non superano i 64 kilobyte) o un file specifico dell'applicazione che si trova in una cartella Dati applicazioni valida.

╚ importante memorizzare i dati dell'applicazione nel percorso corretto per consentire a pi¨ persone di utilizzare lo stesso computer senza danneggiare o sovrascrivere i dati e le impostazioni degli altri utenti.

Per determinare il percorso pi¨ appropriato per i dati dell'applicazione, utilizzare le seguenti categorie per classificare i dati:
  • Per ogni utente (profilo comune): in questa categoria rientrano i dati dell'applicazione specifici per un particolare utente che dovranno essere disponibili all'utente su qualsiasi computer del dominio, ad esempio un dizionario personalizzato. Questa impostazione non Ŕ valida per le applicazioni che non sono progettate per essere eseguite in un ambiente di domini.
  • Per ogni utente (profilo non comune): in questa categoria rientrano i dati dell'applicazione specifici di un particolare utente, ma applicabili solo a un unico computer, ad esempio una risoluzione del monitor specificata dall'utente.
  • Per ogni computer (profilo non comune e non specifico dell'utente): in questa categoria rientrano i dati dell'applicazione per tutti gli utenti e un computer specifico, ad esempio il dizionario di un'applicazione, un file di registro o un file temporaneo.

Memorizzazione dei dati dell'applicazione nel percorso corretto

Utilizzare la funzione SHGetFolderPath per recuperare la cartella Dati applicazioni corretta. Non salvare dati dell'applicazione direttamente in questa cartella. Utilizzare invece la funzione PathAppend per aggiungere una sottocartella al percorso restituito da SHGetFolderPath. Assicurarsi di utilizzare la seguente convenzione:
Nome societÓ\Nome prodotto\Versione prodotto
Il percorso completo risultante potrebbe, ad esempio, essere il seguente:
\Documents and Settings\All Users\Dati applicazioni\SocietÓ\Prodotto\1.0
Per individuare la cartella Dati applicazioni corretta, passare il valore CSIDL corretto, in base alla categoria di dati dell'applicazione.
  • Per ogni utente (profilo comune) utilizzare il valore CSIDL_APPDATA. VerrÓ utilizzato per impostazione predefinita il percorso:
    \Documents and Settings\<Nome utente>\Dati applicazioni
  • Per ogni utente (profilo non comune) utilizzare il valore CSIDL_LOCAL_APPDATA. VerrÓ utilizzato per impostazione predefinita il percorso:
    \Documents and Settings\<Nome utente>\Impostazioni locali\Dati applicazioni
  • Per ogni computer (profilo non comune e non specifico dell'utente) utilizzare il valore CSIDL_COMMON_APPDATA. VerrÓ utilizzato per impostazione predefinita il percorso:
    \Documents and Settings\All Users\Dati applicazioni
Il seguente frammento di codice dimostra come aprire un file di registro temporaneo, che si trova sotto CSIDL_COMMON_APPDATA:
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.
      PathAppend( szPath, "\\My Company\\My Product\\1.0\\" );
      // Generate a temporary file name within this folder.
      if (GetTempFileName( szPath, 
                           "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 );
         }
      }
   }
}
				

Utilizzo del Registro di sistema con cautela

AVVISO: l'errato utilizzo dell'editor del Registro di sistema pu˛ causare seri problemi che potrebbero richiedere la reinstallazione del sistema operativo. Microsoft non Ŕ in grado di garantire la risoluzione di problemi causati dall'errato utilizzo dell'editor del Registro di sistema. L'utilizzo dell'editor del Registro di sistema Ŕ a rischio e pericolo dell'utente.

╚ anche possibile utilizzare il Registro di sistema per memorizzare piccole quantitÓ di dati dell'applicazione. Per i dati oltre 64 kilobyte (KB) Ŕ necessario utilizzare la cartella Dati applicazioni. Quando si utilizza il Registro di sistema per memorizzare dati dell'applicazione, osservare le seguenti indicazioni:
  • Per piccole quantitÓ di dati utente, utilizzare la chiave del Registro di sistema HKEY_CURRENT_USER (HKCU).
  • Per piccole quantitÓ di dati del computer, utilizzare la chiave del Registro di sistema HKEY_LOCAL_MACHINE (HKLM). L'applicazione non dovrÓ scrivere in HKLM in fase di esecuzione perchÚ, per impostazione predefinita, gli utenti che non sono amministratori dispongono dell'autorizzazione di accesso in sola lettura alla struttura di HKLM.
  • Al momento dell'installazione, l'applicazione non dovrÓ memorizzare pi¨ di 128 KB complessivamente nelle chiavi HKCU e HKLM.
  • I componenti COM (Component Object Model) sono registrati al di sotto della chiave del Registro di sistema HKEY_CLASSES_ROOT (HKCR). La quantitÓ massima di 128 KB non include HKCR.
  • Quando si scrive nella chiave HKLM o HKCU, Ŕ necessario creare chiavi per il nome della societÓ, il nome del prodotto e il numero di versione del prodotto, come segue:
    HKLM\Nome societÓ\Nome prodotto\Versione prodotto
    HKCU\Software\Nome societÓ\Nome prodotto\Versione prodotto
  • Utilizzare le funzioni del Registro di sistema come RegCreateKeyEx e RegSetValueEx per leggere e scrivere voci nel Registro di sistema.

Risoluzione dei problemi

  • Per assicurare che le applicazioni vengano eseguite in versioni precedenti di Windows, oltre a Windows XP, stabilire sempre un collegamento all'implementazione di SHGetFolderPath in Shfolder.dll. Anche se in Windows XP SHGetFolderPath Ŕ inclusa in Shell32.dll, Ŕ possibile che le versioni precedenti di Windows non supportino la funzione in questa DLL.
  • Shfolder.dll Ŕ un componente ridistribuibile e pu˛ essere fornito con le applicazioni personalizzate.
  • Evitare di memorizzare percorsi completi nella cartella Documenti o in altre cartelle di sistema in una posizione specifica dell'applicazione, ad esempio l'elenco dei file utilizzati pi¨ di recente, poichÚ un utente o l'amministratore potrebbe riposizionare queste cartelle nei successivi utilizzi dell'applicazione.

Riferimenti

Per ulteriori articoli della Microsoft Knowledge Base specifici di Visual C++ .NET, visitare il Supporto tecnico di Visual C++ .NET sul seguente sito Web Microsoft:
Supporto tecnico di Visual C++ .NET (2002)
http://support.microsoft.com/ph/1109
Per ulteriori informazioni generali su Visual C++ .NET, accedere al seguente newsgroup Usenet (informazioni in lingua inglese):
Microsoft.public.dotnet.languages.vc
Per ulteriori informazioni su tutte le cartelle che possono essere identificate da SHGetFolderPath, fare riferimento alla seguente documentazione di Microsoft Platform Software Development Kit (SDK) (informazioni in lingua inglese):
CSIDL
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp
Per ulteriori informazioni sulla programmazione della shell in generale, fare riferimento al sito Web MSDN (informazioni in lingua inglese):
Guida per i programmatori della shell
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/programmersguide/shell_intro.asp

ProprietÓ

Identificativo articolo: 310294 - Ultima modifica: mercoledý 7 giugno 2006 - Revisione: 2.1
Le informazioni in questo articolo si applicano a
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2002 Standard Editionáalle seguenti piattaforme
    • Microsoft Windows XP Tablet PC Edition
    • Microsoft Windows XP Professional
    • Microsoft Windows XP Media Center Edition
    • Microsoft Windows XP Home Edition
  • Microsoft Visual C++ .NET 2003 Standard Editionáalle seguenti piattaforme
    • Microsoft Windows XP Tablet PC Edition
    • Microsoft Windows XP Professional
    • Microsoft Windows XP Media Center Edition
    • Microsoft Windows XP Home Edition
Chiavi:á
kbhowtomaster kbnewsgrouplink KB310294
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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