ID Artikel: 310294 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0

Bagaimana menulis aplikasi Windows XP yang menyimpan data pengguna dan aplikasi di lokasi yang benar dengan menggunakan Visual C++

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
Penting Artikel ini berisi informasi tentang cara mengubah registri. Pastikan Anda membuat salinan cadangan registri sebelum mengubahnya. Pastikan Anda mengetahui cara memulihkan registri jika terjadi masalah. Untuk informasi selengkapnya tentang cara membuat cadangan, memulihkan, dan mengubah registri, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
322756  (http://support.microsoft.com/kb/322756/ ) Cara membuat cadangan dan memulihkan registri di Windows
Catatan Microsoft Visual C++.NET 2002, Microsoft Visual C++.NET 2003, Microsoft Visual C++ 2005 dan Microsoft Visual c ++ 2008 mendukung kedua kode dikelola model yang disediakan oleh Microsoft.NET Framework dan tidak dikelola asli Microsoft Windows kode model. Informasi di dalam artikel ini hanya berlaku untuk tidak dikelola kode Visual C++

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Aplikasi bekerja dengan dua jenis dokumen: orang-orang yang pengguna menciptakan dan orang-orang yang menciptakan aplikasi. Aplikasi Anda harus menggunakan SHGetFolderPath Shell fungsi untuk mengambil folder yang benar lokasi untuk menyimpan data itu khusus untuk pengguna dan aplikasi. Ini sangat penting untuk Windows XP aplikasi untuk mendukung beberapa pengguna yang menggunakan komputer yang sama dan untuk memungkinkan pengguna untuk beralih cepat.

Artikel ini menjelaskan cara menyimpan data pengguna di tempat yang benar dalam langkah-langkah berikut:
  • Membuat aplikasi Win32.
  • Tambahkan Simpan sebagai opsi untukBerkas menu.
  • Menggunakan standar Simpan file kotak dialog untuk default untuk lokasi yang benar.
  • Verifikasi file yang benar menyimpan lokasi.
  • Ingat pengguna pilihan sebelumnya.
  • Memverifikasi pengguna pilihan sebelumnya.
Dalam langkah-langkah berikut, artikel ini juga menjelaskan di mana Anda harus menyimpan aplikasi data dan bagaimana untuk memastikan bahwa itu adalah disimpan dalam lokasi yang sesuai:
  • Mengklasifikasikan aplikasi data.
  • Menyimpan aplikasi data di lokasi yang benar.
  • Menggunakan registri bijaksana.

Persyaratan

Daftar berikut menguraikan fitur perangkat keras, perangkat lunak, jaringan infrastruktur, keterampilan, pengetahuan, dan layanan paket yang Anda butuhkan:
  • Windows XP Home Edition atau Windows XP Profesional
  • Visual Studio 2008, Visual Sudio 2005, atau Visual Studio.NET.
  • Pengetahuan tentang pengembangan aplikasi Win32

Membuat aplikasi Win32

Mulai Visual Studio, dan membuat aplikasi Win32 baru bernama SavingData.
  • Dalam Visual Studio.NET, klik Visual C++ Proyek di bawah Jenis proyek, lalu klikWin32 proyek di bawah Pola acu. Menerima Pengaturan aplikasi default aplikasi setup wizard menampilkan.
  • Pada Visual Studio 2005 atau 2008, klik Visual C++di bawah Jenis proyek, lalu klik Win32 Project di bawah Pola acu. Menerima default Pengaturan aplikasi.

Tambahkan Simpan sebagai pilihan untuk File Menu

  1. Klik Lihat sumber, kemudian klik dua kaliIDC_SAVINGDATA.
  2. Tambahkan Simpan sebagai menu pilihan untukBerkas menu. Penggunaan IDM_FILE_SAVEAS sebagai ID menu item.
  3. Cari aplikasi WndProc jendela prosedur dalam SavingData.cppm dan menambahkan baru kasus pernyataan dalam WM_COMMAND bagian untuk proses Simpan sebagai opsi menu. Panggilan The OnFileSaveAs fungsi, yang Anda akan membuat pada bagian berikutnya. Ini fungsi mengambil parameter tidak.

    Kode Anda akan muncul sebagai berikut:
    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;
    

Menggunakan standar kotak dialog File Simpan ke default untuk lokasi yang benar

Bila pengguna menampilkan aplikasi Simpan file(atau Buka file) kotak dialog untuk pertama kalinya, kotak dialog harus default ke map Dokumen saya pengguna (atau keturunan dari saya Dokumen, seperti My Pictures untuk data gambar dan musik saya untuk audio file).

CATATAN: Anda harus tidak pernah keras kode jalan dalam aplikasi Anda karena Anda tidak pernah dapat menjamin lokasi fisik. Misalnya, Administrator dapat memindahkan map Dokumen saya ke lokasi jaringan.
  1. Di atas SavingData.cpp, menambahkan meliputi berikut pernyataan:
    #include <commdlg.h>   // for GetSaveFileName
    #include <shlobj.h>    // for SHGetFolderPath
    					
  2. Tambahkan prototipe berikut untuk OnFileSaveAs fungsi:
    void OnFileSaveAs( HWND hWnd );
    					
  3. Buat baru OnFileSaveAs fungsi. Dalam fungsi ini, menggunakan SHGetFolderPath fungsi dalam hubungannya dengan CSIDL_MYPICTURES CSIDL pengidentifikasi untuk mengambil folder benar lokasi untuk menyimpan data gambar. Lulus lokasi folder ini untuk GetSaveFileName fungsi untuk menampilkan standar Simpan filekotak dialog.

    Kode Anda akan muncul sebagai berikut:
    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.
        }
    }
    

Verifikasi File yang benar menyimpan lokasi

  1. Tekan tombol F5 untuk membangun proyek.
  2. Menjalankan aplikasi, dan klik Simpan sebagaidari Berkas menu.
  3. Memverifikasi bahwa standar Simpan file dialog kotak default ke folder My Pictures, sebagai CSIDL_MYPICTURES menentukan.
  4. Klik Batalkan untuk menutup kotak dialog, dan menutup aplikasi.

Ingat pilihan sebelumnya pengguna

Untuk penggunaan berikutnya Simpan file (atau Buka file) kotak dialog, disarankan bahwa kotak dialog default untuk pengguna sebelumnya dipilih lokasi.

Jika Anda tidak menyediakan lokasi folder awal dalam OPENFILENAME struktur, GetSaveFileName (dan GetOpenFileName) menampilkan standar Simpan file atau Berkas Terbuka kotak dialog, yang menunjuk ke map Dokumen saya. Sebagai tambahan Jika pengguna telah menggunakan salah satu kotak dialog ini sebelumnya dan telah memilih non-standar folder, fungsi-fungsi ini secara otomatis default ke sebelumnya folder digunakan.

Untuk mendukung penerapan terbaik disarankan penargetan lokasi folder tertentu (seperti My Pictures) pertama kali pengguna menyimpan atau load sebuah file, dan kemudian default ke pengguna sebelumnya dipilih lokasi, Anda harus menggunakan variabel Boolean untuk melacak apakah ini adalah yang pertama waktu pengguna telah melakukan Simpan atau operasi terbuka.
  1. Membuat static BOOL variabel bernama bFirstSave dalam OnFileSaveAs fungsi, dan menginisialisasi untuk BENAR.
  2. Memodifikasi kode dalam OnFileSaveAs untuk memanggil SHGetFolderPath dan mengatur lpstrInitialDir anggota OPENFILENAME struktur, hanya jika bFirstSave adalah BENAR.
  3. Jika pengguna mengklik Simpan dalamSimpan file kotak dialog, set bFirstSave untukPALSU.

    Kode Anda akan muncul sebagai berikut:
    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.
        }
    }
    

Memverifikasi pengguna sebelumnya seleksi

  1. Membangun proyek, dan menjalankan aplikasi.
  2. Dari Berkas menu, klik Simpan Sebagai.
  3. People dari folder My Pictures untuk dokumen saya folder, pilih file, dan klik Simpan.
  4. Dari Berkas menu, klik Simpan Sebagai lagi.
  5. Verifikasi bahwa kotak dialog default Anda sebelumnya pilihan (dalam hal ini, dokumen saya).
  6. Klik Batalkan untuk mengabaikan kotak dialog, dan menutup aplikasi.
  7. Menjalankan aplikasi, dan klik Simpan sebagaidari Berkas menu.
  8. Verifikasi bahwa kotak dialog default kembali ke My Pictures folder.
  9. Tutup kotak dialog, dan keluar dari aplikasi.

Mengklasifikasikan aplikasi Data

Anda harus menyimpan data aplikasi-spesifik (seperti sementara file, preferensi pengguna, file konfigurasi aplikasi, dan sebagainya) di saya Map dokumen. Sebaliknya, gunakan salah satu lokasi yang sesuai di jendela Registri (untuk data yang tidak melebihi 64 kilobyte) atau aplikasi-spesifik file yang terletak di aplikasi Data yang benar folder.

Penting untuk menyimpan aplikasi data yang benar lokasi untuk memungkinkan beberapa orang untuk menggunakan komputer yang sama tanpa merusak atau Timpa satu sama lain data dan pengaturan.

Untuk menentukan yang paling sesuai lokasi untuk data aplikasi, menggunakan kategori berikut untuk mengelompokkan data Anda:
  • Untuk setiap pengguna (roaming): Kategori ini menggambarkan aplikasi data yang khusus untuk pengguna tertentu dan harus tersedia bagi pengguna seperti dia bergerak di antara komputer dalam sebuah domain (misalnya, kamus kustom). Catatan bahwa ini Pengaturan berlaku untuk aplikasi yang tidak dirancang untuk menjalankan di domain lingkungan.
  • Untuk setiap pengguna (non-roaming): Kategori ini menggambarkan aplikasi data yang khusus untuk pengguna tertentu tetapi hanya berlaku untuk satu komputer (misalnya, pengguna-ditentukan monitor resolusi).
  • Untuk setiap komputer (non-user spesifik dan non-roaming): Kategori ini menggambarkan aplikasi data yang berlaku untuk semua pengguna dan komputer (misalnya, aplikasi Wörterbuch, log file, atau berkas sementara).

Menyimpan aplikasi Data di lokasi yang benar

Anda menggunakan SHGetFolderPath fungsi untuk mengambil folder aplikasi Data yang benar. Jangan menyimpan aplikasi data secara langsung dalam folder ini. Sebaliknya, gunakan PathAppend fungsi untuk menambahkan subfolder ke jalan yang SHGetFolderPath kembali. Pastikan bahwa Anda menggunakan konvensi berikut:
Perusahaan Name\Product Name\Product versi
Sebagai contoh, path lengkap resultan mungkin muncul sebagai berikut:
\Documents and Settings\All Users\Application Data\My Company\My Product\1.0
Untuk menemukan folder aplikasi Data yang benar, lulus sesuai CSIDL nilai, berdasarkan kategori data aplikasi Anda.
  • Untuk setiap data pengguna (roaming), menggunakan CSIDL_APPDATA nilai. Ini default ke lintasan berikut ini:
    \Documents and Settings\Nama penggunaMengatakan \Application data
  • Untuk setiap data pengguna (non-roaming), menggunakan CSIDL_LOCAL_APPDATA nilai. Ini default ke lintasan berikut ini:
    \Documents and Settings\Nama penggunaMengatakan \Local Settings\Application data
  • Untuk setiap komputer (non-user spesifik dan non-roaming) data, menggunakan CSIDL_COMMON_APPDATA nilai. Ini default ke lintasan berikut ini:
    \Documents and Settings\All Users\Application Data
Berikut kode fragmen menunjukkan bagaimana untuk membuka Sementara file log, yang terletak di bawah 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();
   }
}

Menggunakan registri bijaksana

Penting Bagian ini, metode, atau tugas yang memuat langkah-langkah yang memberitahu Anda bagaimana memodifikasi registri. Namun, masalah yang serius dapat terjadi apabila Anda salah memodifikasi registri. Oleh karena itu, pastikan Anda mengikuti langkah-langkah tersebut dengan seksama. Untuk perlindungan tambahan, buat cadangan registri sebelum Anda memodifikasi. Kemudian, Anda dapat memulihkan registri apabila terjadi masalah. Untuk informasi selengkapnya tentang cara membuat cadangan dan memulihkan registri, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
322756  (http://support.microsoft.com/kb/322756/ ) Cara membuat cadangan dan memulihkan registri di Windows

Anda juga dapat menggunakan registri untuk menyimpan kecil sejumlah aplikasi data. Untuk data yang melebihi 64 kilobyte (KB), Anda harus menggunakan folder aplikasi Data. Mengamati panduan berikut bila Anda menggunakan registri untuk menyimpan data aplikasi:
  • Untuk sejumlah kecil data pengguna, gunakan HKEY_CURRENT_USER (REGISTER ASAL HKCU) kunci registri.
  • Untuk sejumlah kecil data komputer, menggunakan HKEY_LOCAL_MACHINE (HKLM) kunci registri. Aplikasi Anda harus tidak menulis untuk HKLM pada menjalankan waktu karena, secara default, pengguna non-administrator hanya memiliki akses hanya-baca HKLM pohon.
  • Saat instalasi, aplikasi Anda harus menyimpan lebih dari total 128 KB di REGISTER ASAL HKCU dan HKLM.
  • Komponen Object Model (COM) komponen terdaftar di bawah HKEY_CLASSES_ROOT (HKCR) kunci registri. Maksimum 128 KB tidak termasuk HKCR.
  • Ketika Anda menulis untuk HKLM atau REGISTER ASAL HKCU, Anda harus membuat kunci untuk nama perusahaan, nama produk, dan nomor versi produk, sebagai berikut:
    HKLM\Software\Company Name\Product Name\Product versi
    HKCU\Software\Company Name\Product Name\Product versi
  • Menggunakan fungsi registri (seperti RegCreateKeyEx dan RegSetValueEx) untuk membaca dan menulis entri registri.

Pemecahan Masalah

  • Untuk membantu memastikan bahwa aplikasi yang berjalan pada versi sebelumnya Windows selain untuk Windows XP, selalu link ke SHGetFolderPath implementasi di Shfolder.dll. Meskipun Windows XP meliputi SHGetFolderPath dalam Shell32.dll, Windows versi sebelumnya mungkin tidak mendukung fungsi dalam ini dynamic-link library (DLL).
  • Shfolder.dll adalah komponen yang dapat didistribusikan ulang dan mungkin didistribusikan dengan aplikasi Anda.
  • Jangan menyimpan sepenuhnya kualifikasi jalan untuk dokumen saya folder (atau folder sistem lainnya) dalam aplikasi-spesifik tempat seperti daftar berkas yang paling baru-baru ini digunakan file karena pengguna atau Administrator mungkin memindahkan folder ini antara berturut-turut penggunaan aplikasi Anda.

REFERENSI

Lain atas-hit Visual C++.Basis Pengetahuan NET Microsoft Artikel, kunjungi Visual C++.NET Support Center di Microsoft berikut Situs web:
Visual C++.Pusat dukungan bersih (2002)
http://support.Microsoft.com/default.aspx?xmlid=Fh%3BEN-US%3Bvcnet (http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet)
Untuk lebih banyak informasi umum tentang Visual C++.NET, kunjungi newsgroup Microsoft Usenet berikut:
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)
Untuk informasi lebih lanjut tentang set lengkap folder yang SHGetFolderPath dapat mengidentifikasi, lihat berikut Microsoft Platform perangkat lunak Development Kit (SDK) dokumentasi:
CSIDL
http://MSDN.Microsoft.com/en-us/library/bb762494.aspx (http://msdn.microsoft.com/en-us/library/bb762494.aspx)
Untuk informasi lebih lanjut tentang shell pemrograman secara umum, lihat situs Web Microsoft Developer Network (MSDN) berikut:
Shell programer panduan
http://msdn2.Microsoft.com/en-us/library/bb776778.aspx (http://msdn2.microsoft.com/en-us/library/bb776778.aspx)

Berlaku bagi:
  • 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
Kata kunci: 
kbhowtomaster kbnewsgrouplink kbmt KB310294 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:310294  (http://support.microsoft.com/kb/310294/en-us/ )