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

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 310294 - Melihat produk di mana artikel ini berlaku.
Penting Artikel ini berisi informasi tentang cara mengubah registri. Pastikan bahwa Anda membuat cadangan registri sebelum Anda memodifikasinya. Pastikan bahwa Anda tahu cara memulihkan registri jika terjadi masalah. Untuk selengkapnya tentang cara membuat cadangan, memulihkan, dan memodifikasi registri, klik nomor artikel berikut ini untuk melihat artikel di dalam Pangkalan Pengetahuan Microsoft:
322756 Cara membuat cadangan dan memulihkan registri pada Windows
Catatan Microsoft Visual C ++ .NET 2002, Microsoft Visual C++ .NET 2003, Microsoft Visual C++ 2005, dan Microsoft Visual C ++ 2008 mendukung model dikelola kode yang disediakan oleh Microsoft .NET Framework dan Microsoft Windows asli unmanaged kode model. Informasi dalam artikel ini hanya berlaku untuk unmanaged kode Visual C++
Perbesar semua | Perkecil semua

Pada Halaman ini

Ringkasan

Aplikasi bekerja dengan dua jenis dokumen: orang-orang yang pengguna menciptakan dan orang-orang yang menciptakan aplikasi. Aplikasi Anda harus menggunakan fungsi shell SHGetFolderPath untuk mengambil folder yang benar lokasi untuk menyimpan data itu khusus untuk pengguna dan aplikasi. Hal ini 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 untukFile menu.
  • Menggunakan standar File Save kotak dialog untuk default ke lokasi yang benar.
  • Pastikan file yang benar menyimpan lokasi.
  • Ingat pilihan pengguna sebelumnya.
  • Memverifikasi pengguna pilihan sebelumnya.
Pada langkah berikutnya, artikel ini juga menjelaskan di mana Anda harus menyimpan aplikasi data dan bagaimana untuk memastikan bahwa itu disimpan dalam lokasi yang sesuai:
  • Mengelompokkan data aplikasi.
  • Menyimpan data aplikasi di lokasi yang benar.
  • Menggunakan registri bijaksana.

Persyaratan

Daftar berikut menguraikan fitur peranti penangkap keras, peranti penangkap 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 Template. Menerima default pengaturan aplikasi aplikasi setup wizard Menampilkan.
  • Dalam Visual Studio 2005 atau 2008, klik Visual C++di bawah Jenis proyek, lalu klik Win32 Proyek di bawah Template. Menerima default pengaturan aplikasi.

Tambahkan Simpan sebagai pilihan untuk menu Berkas

  1. Klik tampilan sumber daya, kemudian klik ganda IDC_SAVINGDATA.
  2. Tambahkan Simpan sebagai menu pilihan untukFile menu. Menggunakan IDM_FILE_SAVEAS sebagai ID item menu.
  3. Telisik aplikasi WndProc jendela prosedur dalam SavingData.cppm dan menambahkan pernyataan kasus baru dalam bagian WM_COMMAND untuk memproses Simpan sebagai pilihan menu. Panggilan fungsi OnFileSaveAs , 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 Simpan File ke default untuk lokasi yang benar

Bila pengguna menampilkan aplikasi File Save(atau Buka file) kotak dialog untuk pertama kalinya, kotak dialog harus default ke folder My Documents pengguna (atau keturunan saya kumpulan dokumen, seperti gambar-gambar saya untuk data gambar dan Musik Saya saya untuk audio file).

Catatan: Anda harus tidak pernah keras kode jalan dalam aplikasi Anda karena Anda tidak dapat menjamin lokasi fisik. Misalnya, Administrator mungkin memindahkan folder My Documents ke lokasi jaringan.
  1. Di bagian 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. Membuat fungsi OnFileSaveAs baru. Dalam fungsi ini, menggunakan fungsi SHGetFolderPath dalam hubungannya dengan pengenal CSIDLCSIDL_MYPICTURES untuk mengambil folder benar lokasi untuk menyimpan data gambar. Lulus lokasi folder ini ke fungsi GetSaveFileName untuk menampilkan standar File Savekotak 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.
        }
    }
    

Pastikan File yang benar menyimpan lokasi

  1. Tekan tombol tekan F5 untuk membangun proyek.
  2. Jalankan aplikasi, dan klik Simpan sebagaidari File menu.
  3. Memverifikasi bahwa standar File Save dialog kotak folder standar My Pictures, seperti CSIDL_MYPICTURES menentukan.
  4. Klik Batal untuk menutup kotak dialog, dan menutup aplikasi.

Ingat pilihan pengguna sebelumnya

Untuk penggunaan selanjutnya File Save (atau Buka file) kotak dialog, disarankan bahwa kotak dialog default ke pengguna lokasi yang dipilih sebelumnya.

Jika Anda tidak menyediakan lokasi folder awal struktur OPENFILENAME , GetSaveFileName (dan GetOpenFileName) menampilkan standar File Save atau File Buka kotak dialog, yang menunjuk ke folder My Documents. Sebagai tambahan Jika pengguna telah menggunakan salah satu kotak dialog ini sebelumnya dan telah memilih folder non-default, fungsi ini secara otomatis default ke sebelumnya folder digunakan.

Untuk mendukung penerapan terbaik disarankan penargetan lokasi folder tertentu (seperti My Pictures) pertama kalinya pengguna menyimpan atau load file, dan kemudian default ke pengguna dipilih sebelumnya lokasi, Anda harus menggunakan variabel Boolean untuk melacak apakah ini adalah yang pertama waktu pengguna telah melakukan Simpan atau operasi terbuka.
  1. Membuat variabel statis BOOL bernama bFirstSave dalam fungsi OnFileSaveAs , dan menginisialisasi ke TRUE.
  2. Memodifikasi kode dalam OnFileSaveAs untuk memanggil SHGetFolderPath dan menetapkan anggota lpstrInitialDir struktur OPENFILENAME , hanya jika bFirstSavebenar.
  3. Jika pengguna mengklik Simpan dalamFile Save 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 File Menu, klik Simpan Sebagai.
  3. Melihat isi dari folder My Pictures untuk My Documents folder, pilih file, lalu klik Simpan.
  4. Dari File Menu, klik Simpan Sebagai lagi.
  5. Pastikan bahwa kotak dialog default Anda sebelumnya pilihan (dalam kasus ini, My Documents).
  6. Klik Batal untuk mengabaikan kotak dialog, dan menutup aplikasi.
  7. Jalankan aplikasi, dan klik Simpan sebagaidari File menu.
  8. Pastikan bahwa kotak dialog default kembali ke My Pictures folder.
  9. Tutup kotak dialog, dan keluar dari aplikasi.

Mengklasifikasikan Data aplikasi

Anda tidak harus menyimpan data aplikasi-spesifik (seperti sementara file, preferensi pengguna, file konfigurasi aplikasi, dan sebagainya) di saya Folder kumpulan dokumen. Sebaliknya, gunakan salah satu lokasi yang tepat di Windows Registri (untuk data yang tidak melebihi 64 kilobyte) atau file aplikasi-spesifik yang terdapat dalam Data aplikasi yang valid folder.

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

Untuk menentukan yang paling sesuai lokasi data aplikasi, menggunakan kategori berikut untuk mengklasifikasikan data Anda:
  • Untuk setiap pengguna (roaming): Kategori ini menggambarkan aplikasi data yang khusus untuk pengguna tertentu dan harus tersedia bagi pengguna ketika ia bergerak antara komputer dalam sebuah domain (misalnya, kustom kamus). Catatan bahwa ini pengaturan tidak sahih untuk aplikasi yang tidak dirancang untuk dijalankan dalam domain lingkungan.
  • Untuk setiap pengguna (non-roaming): Kategori ini menggambarkan aplikasi data yang khusus untuk pengguna tertentu tetapi berlaku hanya untuk satu komputer (misalnya, resolusi monitor ditentukan pengguna).
  • Untuk setiap komputer (non-user spesifik dan bebas roaming): Kategori ini menggambarkan data aplikasi yang berlaku untuk semua pengguna dan komputer tertentu (misalnya, aplikasi kamus, log file, atau file sementara).

Menyimpan Data aplikasi dalam lokasi yang benar

Anda menggunakan fungsi SHGetFolderPath untuk mengambil folder aplikasi Data yang benar. Jangan menyimpan data aplikasi langsung dalam folder ini. Sebaliknya, gunakan fungsi PathAppend 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 dan Settings\All Users\Application Data\My Company\My Product\1.0
Untuk menemukan folder aplikasi Data yang benar, lulus sesuai nilai CSIDL , berdasarkan Kategori data aplikasi Anda.
  • Untuk setiap pengguna data (roaming), gunakan nilai CSIDL_APPDATA . Ini default ke lintasan berikut:
    \Documents dan Settings\Nama penggunamengatakan \Application Data
  • Untuk setiap pengguna data (non-roaming), gunakan nilai CSIDL_LOCAL_APPDATA . Ini default ke lintasan berikut:
    \Documents dan Settings\Nama penggunamengatakan \Local Settings\Application Data
  • Untuk setiap data komputer (non-user spesifik dan bebas roaming), gunakan nilai CSIDL_COMMON_APPDATA . Ini default ke lintasan berikut:
    \Documents dan Settings\All Users\Application Data
Fragmen kode berikut 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 untuk mengubah registri. Namun, masalah serius mungkin muncul saat Anda salah memodifikasi registri. Oleh karena itu, pastikan Anda mengikuti langkah-langkah ini dengan hati-hati. Untuk perlindungan tambahan, buat cadangan registri sebelum Anda memodifikasinya. Kemudian, Anda dapat memulihkan registri jika terjadi masalah. Untuk informasi lebih lanjut tentang cara membuat cadangan dan memulihkan registri, klik nomor artikel berikut ini untuk melihat artikel di dalam Pangkalan Pengetahuan Microsoft:
322756 Cara membuat cadangan dan memulihkan registri pada Windows

Anda juga dapat menggunakan registri untuk menyimpan kecil jumlah aplikasi data. Untuk data yang melebihi 64 kilobyte (KB), Anda harus menggunakan Application Data folder. Mengamati panduan berikut ketika Anda menggunakan registri untuk menyimpan data aplikasi:
  • Untuk sejumlah kecil data pengguna, gunakan tombol tekan registri HKEY_CURRENT_USER (HKCU).
  • Untuk sejumlah kecil data komputer, gunakan tombol tekan registri HKEY_LOCAL_MACHINE (HKLM). Aplikasi Anda harus menulis untuk HKLM pada jangka waktu karena, secara asali, pengguna non-administrator hanya memiliki akses baca-saja HKLM pohon.
  • Pada saat instalasi, aplikasi Anda harus menyimpan lebih dari total 128 KB di HKCU dan HKLM.
  • Komponen objek Model (COM) komponen terdaftar di bawah bukti kunci registri HKEY_CLASSES_ROOT (HKCR). Maksimum 128 KB tidak termasuk HKCR.
  • Ketika Anda menulis HKLM atau HKCU, Anda harus membuat bukti 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 registri fungsi (seperti RegCreateKeyEx dan RegSetValueEx) untuk membaca dan menulis entri registri.

Pemecahan masalah

  • Untuk membantu memastikan bahwa aplikasi yang berjalan pada versi sebelumnya Windows selain Windows XP, selalu link ke implementasi SHGetFolderPath di Shfolder.dll. Meskipun Windows XP mencakup SHGetFolderPath di Shell32.dll, Windows versi sebelumnya mungkin tidak mendukung fungsi dalam ini dynamic-link library (DLL).
  • Shfolder.dll adalah komponen redistributable dan mungkin didistribusikan dengan aplikasi Anda.
  • Jangan menyimpan jalan sepenuhnya memenuhi syarat untuk My Documents (atau folder sistem lainnya) dalam aplikasi-spesifik tempat seperti Daftar file baru saja menggunakan file karena pengguna atau Administrator mungkin memindahkan folder ini antara berturut-turut penggunaan aplikasi Anda.

Referensi

Lain atas-hit Visual C++ .NET Microsoft Knowledge Base Artikel, mengunjungi pusat dukungan Visual C++ .NET di Microsoft berikut Situs web:
Pusat Dukungan Visual C++ .NET (2002)
http://support.Microsoft.com/default.aspx?xmlid=FH%3BEN-US%3Bvcnet
Untuk informasi lebih lanjut tentang set lengkap folder yang SHGetFolderPath dapat mengidentifikasi, lihat berikut Microsoft Platform peranti penangkap lunak Development Kit (SDK) dokumentasi:
CSIDL
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 programmer panduan
http://msdn2.Microsoft.com/en-US/Library/bb776778.aspx

Properti

ID Artikel: 310294 - Kajian Terakhir: 20 Juli 2013 - Revisi: 3.0
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 Mesin
PENTING: Artikel ini diterjemahkan oleh perangkat lunak penerjemahan mesin Microsoft, dan mungkin telah diedit oleh Masyarakat Microsoft melalui teknologi CTF dan bukan oleh seorang penerjemah profesional. Microsoft menawarkan baik artikel yang diterjemahkan oleh manusia maupun artikel hasil editan terjemahan oleh mesin/komunitas, sehingga Anda dapat mengakses semua artikel di Sentra Pengetahuan yang kami miliki dalam berbagai bahasa. Namun artikel hasil editan mesin atau bahkan komunitas tidak selalu sempurna. Artikel ini dapat mengandung kesalahan dalam hal kosa kata, sintaksis atau tatabahasa, sangat mirip dengan penutur asing yang membuat kekeliruan ketika berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab atas ketidakakuratan, kesalahan atau kerugian apa pun akibat dari kekeliruan dalam penerjemahan isi atau penggunaannya oleh pelanggan kami. Microsoft juga akan senantiasa memperbarui perangkat lunak penerjemahan mesin dan alat untuk menyempurnakan Editan Hasil Penerjemahan Mesin.
Klik disini untuk melihat versi Inggris dari artikel ini: 310294

Berikan Masukan

 

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