Visual C++ kullanarak doğru konumda kullanıcı ve uygulama verilerini depolayan bir Windows XP uygulaması yazmak nasıl

Makale çevirileri Makale çevirileri
Makale numarası: 310294 - Bu makalenin geçerli olduğu ürünleri görün.
Önemli Bu makale, kayıt defterini değiştirmeyle ilgili bilgiler içermektedir. Kayıt defterini değiştirmeden önce yedeklediğinizden emin olun. Bir sorun çıkması durumunda kayıt defterini nasıl geri yükleyeceğinizi bildiğinizden emin olun. Kayıt defterini yedekleme ve geri yükleme hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
322756 Yedekleme ve Windows kayıt defterini geri yükleme hakkında
Not Microsoft Visual C++ .NET 2002, Visual C++ .NET 2003, Microsoft Visual C++ 2005 ve Microsoft Visual C++ 2008 Microsoft .NET Framework tarafından sağlanan yönetilen kod modeli hem yönetilmeyen yerel Microsoft Windows kod modeli destekler. Bu makaledeki bilgiler yalnızca yönetilmeyen Visual C++ kodu için geçerlidir
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Uygulama iki belge türleri ile çalışır: Bu, kullanıcı oluşturur ve uygulama oluşturur. Uygulamalarınızı SHGetFolderPath Kabuk işlevi veri depolamak için geçerli bir klasör konumları almak için kullanmanız gerekir Kullanıcı ve uygulama özel olmasıdır. Bu Windows için önemlidir Aynı bilgisayarı kullanan birden çok kullanıcı desteği için XP uygulamaları ve Kullanıcıların hızla geçiş sağlamak için.

Bu makalede, nasıl yapılır kullanıcı verilerini aşağıdaki adımları doğru yerde saklayın:
  • Bir Win32 uygulaması oluşturun.
  • Ekleme bir Farklı Kaydet seçeneğiniDosya menü.
  • Standart kullanın Dosya Kaydet iletişim kutusu Varsayılan doğru konuma.
  • Doğru dosya kaydetme konumunu doğrulayın.
  • Kullanıcının önceki seçimini unutmayın.
  • Kullanıcının önceki seçimini doğrulayın.
Aşağıdaki adımlarda, bu da nerede makalede, Uygulama verileri ve saklanmasını emin olmak nasıl saklamanız gerekir uygun konumları:
  • Uygulama verileri sınıflandırmak.
  • Uygulama verileri doğru konumda depolayın.
  • Kayıt dikkatli kullanın.

Gereksinimler

Aşağıdaki listede önerilen donanım, yazılım önerilmektedir, ağ altyapısı, beceriler, bilgi ve hizmet gereken paketleri:
  • Windows XP Home Edition veya Windows XP Professional
  • Visual Studio 2008, Visual Studio 2005 veya Visual Studio .NET.
  • Win32 uygulama geliştirme bilgisi

Win32 uygulaması oluşturma

Visual Studio'yu başlatın ve adlı yeni bir Win32 uygulaması oluşturun SavingData.
  • Visual Studio .NET'i tıklatın. Visual C++ Projeler altında Proje türleriıWin32 Proje altında Şablonları. Kabul et Uygulama Kurulum Sihirbazı varsayılan uygulama ayarları görüntüler.
  • Visual Studio 2005 veya 2008,'ı tıklatın. Visual C++altında Proje türleriı Win32 Proje altında Şablonları. Varsayılan kabul uygulama ayarları.

Kaydetme için Dosya menüsünde seçenek olarak Ekle

  1. ' I tıklatın Kaynak Görünümüve sonra çift tıklatın IDC_SAVINGDATA.
  2. Ekleme bir Farklı Kaydet menü seçeneğiDosya menü. Menü öğesinin kimliği olarak IDM_FILE_SAVEAS kullanın.
  3. Uygulamanın WndProc Uygulama pencere yordamı içinde SavingData.cppm bulun ve işlemek için WM_COMMAND bölüm içindeki yeni bir servis talebi deyimi ekleyin Farklı Kaydet menü seçeneği. Çağrı sonraki bölümde oluşturacağınız OnFileSaveAs işlev. Bu işlev parametre almaz.

    Kodunuzu aşağıdaki gibi görünmelidir:
    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;
    

Doğru konuma standart dosya Kaydet iletişim kutusu varsayılan kullanın

Bir kullanıcı bir uygulamanın ne zaman görüntüler Dosya Kaydet(veya Dosya Aç) iletişim kutusu iletişim kutusu ilk kez kullanıcının Belgelerim klasörünün varsayılan gerekir (veya bir alt öğesi benim Görüntü verilerini Resimlerim ve Müziğim audio için belgeler dosyaları).

Not: hiçbir zaman sabit yolu uygulamanız içinde çünkü kodu gerekir hiçbir zaman fiziksel konumu garanti edilmektedir. Örneğin, bir yönetici Belgelerim klasörü bir ağ konumuna yerini.
  1. SavingData.cpp üstünde aşağıdaki Ekle ekleme bildirimleri:
    #include <commdlg.h>   // for GetSaveFileName
    #include <shlobj.h>    // for SHGetFolderPath
    					
  2. OnFileSaveAs işlevi için aşağıdaki prototipe ekleyin:
    void OnFileSaveAs( HWND hWnd );
    					
  3. Yeni OnFileSaveAs işlevi oluşturun. Bu işlev içinde SHGetFolderPath işlevini CSIDL_MYPICTURES CSIDL tanımlayıcısı ile birlikte saklamak için doğru klasör konumunu almak için kullanın resim verilerini. Standart görüntülemek için GetSaveFileName işlevi bu klasör konumu geçirin Dosya Kaydetiletişim kutusu.

    Kodunuzu aşağıdaki gibi görünmelidir:
    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.
        }
    }
    

Doğru dosya kaydetme konumunu doğrulayın

  1. Projeyi oluşturmak için F5 tuşuna basın.
  2. Uygulamayı çalıştırın ve Farklı Kaydetgelen Dosya menü.
  3. Doğrulayın standart Dosya Kaydet iletişim CSIDL_MYPICTURES belirttiği gibi Resimlerim klasörüne kutusu varsayılan olarak ayarlanır.
  4. ' I tıklatın İptal iletişim kutusunu kapatmak için ve uygulamayı kapatın.

Kullanıcının önceki seçimini unutmayın

Sonraki kullanım Dosya Kaydet (veya Dosya Aç) iletişim kutusunda önerilir, iletişim kutusu kullanıcı için varsayılan konum önceden seçilmiş.

Aksi takdirde AÇIKDOSYAADI yapısı içindeki bir başlangıç klasörü konumu sağlayın, standart GetSaveFileName (ve GetOpenFileName) görüntü Dosya Kaydet veya Dosya Açık iletişim kutusunda, Belgelerim klasörüne işaret. Buna ek olarak, Kullanıcı aşağıdaki iletişim kutularından birini daha önce kullanılmış ve seçmişse bir Varsayılan olmayan, bu işlevleri otomatik olarak varsayılan klasör için önceden klasörü kullanılır.

Hedefleme önerilen en iyi uygulama desteklemek için bir Belirli bir klasör konumu (örneğin, resimler) ilk kez bir kullanıcı kaydeder veya daha önce seçilen dosyayı ve ardından kullanıcının varsayılan olarak yükler. Konum, bu ilk olup olmadığını izlemek için Boolean değişkeni kullanmanız gerekir zaman kullanıcı kaydetme veya açma işlemi gerçekleştirdi.
  1. OnFileSaveAs işlevinde bFirstSave adındaki bir statik BOOL değişkeni oluşturun ve doğruolarak başlatılamadı.
  2. BFirstSaveTRUEise OnFileSaveAsSHGetFolderPath çağırın ve AÇIKDOSYAADI yapısı lpstrInitialDir üye kümesi içindeki kodu değiştirin.
  3. Kullanıcı tıklattığında Kaydet içindeDosya Kaydet iletişim kutusu, ayarlama bFirstSave içinYANLIŞ.

    Kodunuzu aşağıdaki gibi görünmelidir:
    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.
        }
    }
    

Kullanıcının önceki seçimini doğrulama

  1. Projeyi derleyin ve uygulamayı çalıştırın.
  2. Gelen Dosya menüsünde tıklatın Kaydet Olarak.
  3. Belgelerim Resimlerim klasöründen Gözat klasör, bir dosya seçin ve tıklatın Kaydet.
  4. Gelen Dosya menüsünde tıklatın Kaydet Olarak yeniden.
  5. İletişim kutusunda, önceki varsayılan doğrulayın seçimde (Bu durumda, Belgelerim).
  6. ' I tıklatın İptal iletişim kutusunu kapatmak için ve uygulamayı kapatın.
  7. Uygulamayı çalıştırın ve Farklı Kaydetgelen Dosya menü.
  8. İletişim kutusunu tekrar Resimlerim için varsayılanları doğrulayın klasör.
  9. İletişim kutusunu kapatmak ve uygulamadan çıkın.

Uygulama verileri sınıflandırmak

Uygulamaya özgü veri (geçici depolanmamalıdır. dosyaları, kullanıcı tercihleri, uygulama yapılandırma dosyaları vb.), benim Belgeler klasörü. Bunun yerine, Windows uygun bir konumda kullanma Kayıt defteri (için 64 kilobayt geçmediği veri) veya bir Geçerli bir uygulama veri bulunan uygulamaya özgü dosya klasör.

Doğru uygulama verilerini depolamak önemlidir birkaç kişi bozarak olmadan aynı bilgisayarı kullanmak üzere izin vermek için konum veya birbirlerinin verilerini ve ayarlarını üzerine.

En belirlemek için Konum uygulama verileriniz için uygun, aşağıdaki kategorilere kullanın Verilerinizi sınıflandırmak:
  • (Dolaşım) her kullanıcı için: bu kategoriye özgü uygulama verileri tanımlayan bir belirli kullanıcı ve izinli arasında hareket ettikçe kullanıcı için kullanılabilir olmalıdır Bilgisayar bir etki alanına (örneğin, özel bir sözlük) içinde. Not Bu ayarı, bir etki alanında çalışacak şekilde tasarlanmamış uygulamalarda uygulanmaz ortamı.
  • Her kullanıcı için (gezici olmayan): bu kategoriye özgü uygulama verileri tanımlayan bir Belirli bir kullanıcının, ancak yalnızca tek bir bilgisayara uygulanır (örneğin, bir kullanıcı tarafından belirtilen monitör çözünürlüğü).
  • Her bilgisayar için (kullanıcı özel ve gezici olmayan): Bu kategorideki tüm için geçerlidir uygulama verileri açıklar Kullanıcılar ve belirli bir bilgisayara (örneğin, bir uygulama sözlük, günlük Dosya veya geçici bir dosya).

Uygulama verilerini doğru konumda depolamak

Doğru uygulama verileri klasörü almak için SHGetFolderPath işlevini kullanın. Yapmak değil uygulama verilerini doğrudan bu klasörde saklayın. Bunun yerine, bir alt SHGetFolderPath döndüren yolunu eklemek için PathAppend işlevini kullanın. Aşağıdaki kuralını kullandığınızdan emin olun:
Şirket Name\Product Name\Product sürümü
Örneğin, sonuç tam yolunu aşağıdaki gibi görünebilir:
\Documents and Settings\All Users\Application Data\My Company\My Product\1.0
Doğru Application Data klasörü bulmak için geçmesi Uygulama verilerinizi kategoriye göre uygun CSIDL değeri.
  • Her kullanıcı için (gezici) verilerini CSIDL_APPDATA değerinin değer kullanın. Aşağıdaki yolu, varsayılan olarak kullanır:
    \Documents and Settings\kullanıcı adı> \Application veri
  • Her kullanıcı (gezici olmayan) verileri için CSIDL_LOCAL_APPDATA değerini kullanın. Aşağıdaki yolu, varsayılan olarak kullanır:
    \Documents and Settings\kullanıcı adı> \Local veri
  • Her bilgisayar (kullanıcı özel ve gezici olmayan) veri için CSIDL_COMMON_APPDATA değerini kullanın. Aşağıdaki yolu, varsayılan olarak kullanır:
    \Documents and Settings\All Users\Application veri
Aşağıdaki kod parçası nasıl açacağınızı gösterir bir CSIDL_COMMON_APPDATAaltında bulunan geçici günlük dosyası:
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();
   }
}

Kayıt dikkatli kullanmak

Önemli Bu bölüm, yöntem veya görev kayıt defterini nasıl değiştireceğinizin anlatıldığı adımlar içermektedir. Ancak, kayıt defterini hatalı olarak değiştirirseniz önemli sorunlar oluşabilir. Bu nedenle, bu adımları dikkatlice uyguladığınızdan emin olun. Daha fazla koruma için değiştirmeden önce kayıt defterini yedekleyin. Daha sonra bir sorun çıktığında kayıt defterini geri yükleyebilirsiniz. Kayıt defterini yedekleme ve geri yükleme hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
322756 Yedekleme ve Windows kayıt defterini geri yükleme hakkında

Küçük depolamak için kayıt defterini kullanabilirsiniz Uygulama verileri tutarlar. 64 Kilobayt (KB) aşan veriler için yapmanız gerekenler Uygulama verisi klasörü kullanın. Kullandığınızda aşağıdaki yönergelere uyun. uygulama verilerini depolamak için kayıt defteri:
  • Kullanıcı verilerini küçük tutarlar için HKEY_CURRENT_USER (HKCU) kayıt defteri anahtarını kullanın.
  • Bilgisayar verilerini küçük tutarlar için HKEY_LOCAL_MACHINE (HKLM) kayıt defteri anahtarını kullanın. Uygulamanız için HKLM zamanında olduğundan, yazması gerektiğini değil varsayılan olarak, yönetici olmayan kullanıcılar HKLM ağacı salt okunur erişimi vardır.
  • Yükleme sırasında uygulamanız daha saklamanız gerekir. HKCU ve HKLMboyunca 128 KB toplam.
  • Bileşen Nesne Modeli (COM) bileşenleri kaydedilir HKEY_CLASSES_ROOT (HKCR) kayıt defteri anahtarı altında. 128 KB maksimum HKCRiçermez.
  • HKLM veya HKCUyazma, ürün adı, şirket adı, tuşları oluşturmanız gerekir ve Ürün sürüm numarası, aşağıdaki gibi:
    HKLM\Software\Company Name\Product Name\Product sürümü
    HKCU\Software\Company Name\Product Name\Product sürümü
  • Okuma ve kayıt defteri girdileri yazma (örneğin RegCreateKeyEx ve RegSetValueEx) kayıt defteri işlevlerini kullanın.

Sorun giderme

  • Uygulamaların önceki sürümleri üzerinde çalışmasını sağlamak yardımcı olmak için Windows XP'nin yanı sıra Windows her zaman bağlantı Shfolder.dll SHGetFolderPath uygulamasında. Windows XP SHGetFolderPath Shell32.dll dosyasında bulunmasına karşın, Windows'un önceki sürümlerinde olmayan desteklemiyor olabilir Bu dinamik bağlantı kitaplığı (DLL) içinde işlev.
  • Shfolder.dll yeniden dağıtılabilir bir bileşenidir ve olabilir uygulamalarınızla dağıtılmış.
  • Belgelerim tam yollara saklamayın. klasörü (veya diğer sistem klasörlerini) bir uygulamaya özgü içinde yerleştirmek gibi bir bir kullanıcının veya yöneticinin olabilir çünkü son kullanılan dosyaları çoğu dosya listesi Bu klasörler, uygulamanızın art arda kullanımlar arasında yerini.

Referanslar

Diğer üst isabet Visual C++ .NET için Microsoft Bilgi Bankası makaleler, ziyaret edin, aşağıdaki Microsoft Visual C++ .NET Destek Merkezi Web sitesi:
Visual C++ .NET (2002) Destek Merkezi
http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-us%3Bvcnet
Aşağıdaki Microsoft Platform Yazılım SHGetFolderPath tanıyabilirsiniz klasörleri kümesinin tamamı hakkında daha fazla bilgi için bkz. Geliştirme Seti (SDK) belgeleri:
CSIDL
http://msdn.microsoft.com/en-us/library/bb762494.aspx
Kabuk genel programlama hakkında daha fazla bilgi için bkz. aşağıdaki Microsoft Developer Network (MSDN) Web sitesi:
Kabuk Programcı Kılavuzu
http://msdn2.microsoft.com/en-us/library/bb776778.aspx

Özellikler

Makale numarası: 310294 - Last Review: 20 Temmuz 2013 Cumartesi - Gözden geçirme: 4.0
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbhowtomaster kbnewsgrouplink kbmt KB310294 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, Microsoft Makine Çevirisi Düzenleme yazılımı tarafından tercüme edilmiş olup, yüksek olasılıkla profesyonel bir çevirmen yerine CTF teknolojisi kullanılarak, Microsoft Topluluğu tarafından düzenlenmiştir. Microsoft, Bilgi Bankamız içindeki tüm makaleleri kendi dilinizde okuyabilmeniz için size hem profesyonel çevirmenler tarafından tercüme edilen hem de makine tarafından tercüme edildikten sonra Topluluk tarafından kontrol edilen makaleler sunar. Bununla birlikte, makine tarafından tercüme edilen, hatta Topluluk tarafından kontrol edilen bir makale bile her zaman mükemmel dil kalitesinde olmayabilir. Makalede dilinizi konuşan yabancı birisinin yapabileceği türden sözcük, söz dizimi veya dilbilgisi hataları bulunabilir. Microsoft, içeriğin hatalı tercümesinin veya müşterilerimiz tarafından kullanımının doğurabileceği olası yanlış anlamalar, hatalar veya zararlardan sorumlu değildir. Öte yandan Microsoft, Makine Çevirisi Düzenleme işlemini geliştirmek amacıyla Makine Çevirisi Düzenleme yazılımını ve araçlarını sık sık güncelleştirmektedir.
Makalenin İngilizcesi aşağıdaki gibidir: 310294

Geri Bildirim Ver

 

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