Makale numarası: 310294 - Son Gözden Geçirme: 20 Mart 2008 Perşembe - Gözden geçirme: 3.1

Visual C++ kullanarak, kullanıcı ve uygulama verilerini doğru konumda saklayan bir Windows XP uygulaması yazma

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Önemli Bu makale, kayıt defterini düzenlemeyle ilgili bilgi içerir. Kayıt defterini değiştirmeden önce yedeklemeyi unutmayın. Bir sorun çıkması durumunda kayıt defterini nasıl geri yükleyeceğinizi bildiğinizden emin olun. Kayıt defterini yedekleme, geri yükleme ve değiştirme hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makaleyi inceleyin:
322756  (http://support.microsoft.com/kb/322756/ ) Windows'da kayıt defterini yedekleme ve geri yükleme
Not Microsoft Visual C++ .NET 2002, Visual C++ .NET 2003, Visual C++ 2005 ve Visual C++ 2008 Microsoft .NET Framework tarafından sağlanan bir yönetilen kod model hem de yerel Microsoft Windows kod modeli yönetilmeyen destekler. Bu makaledeki bilgiler yalnızca yönetilmeyen Visual C++ kodu için geçerlidir.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Uygulama belgeleri iki tür çalışma:, kullanıcı oluşturur ve bu uygulama oluşturur. Uygulamalarınızı, kullanıcı ve uygulama için özel verileri depolamak için geçerli bir klasör konumlarını almak için SHGetFolderPath Kabuk işlevini kullanmalısınız. Bu, aynı bilgisayarı kullanan birden çok kullanıcı desteği ve hızlı biçimde geçiş yapmak, kullanıcıların Windows XP uygulamaları için gereklidir.

Bu makale, aşağıdaki adımları doğru yere kullanıcı verilerini depolamak açıklamaktadır:
  • Bir Win32 uygulaması oluşturun.
  • Kaydet seçeneği için <a2>Dosya</a2> menüsünü ekleyin.
  • Varsayılan standart Dosya Kaydet iletişim kutusunda, doğru konuma kullanın.
  • Doğru dosya kaydetme konumunu doğrulayın.
  • Kullanıcı önceki seçim unutmayın.
  • Kullanıcı önceki seçim doğrulayın.
Aşağıdaki adımlarda, bu makalede ayrıca uygulama verilerini depolamak ve uygun konumda saklanır sağlamak nasıl açıklanır:
  • Uygulama verileri classify.
  • Uygulama verileri doğru konuma depolayın.
  • Kayıt defterinin dikkatli kullanın.

Gereksinimler

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

Bir Win32 uygulaması oluşturma

Visual Studio'yu başlatın ve SavingData adlı yeni bir Win32 uygulaması oluşturun.
  • Visual Studio. NET'te, Visual C++ ProjectsProject Types altında tıklatın ve Win32 Projectşablonları altında tıklatın. Uygulama Kurulum Sihirbazı'nı görüntüler varsayılan uygulama ayarlarını kabul edin.
  • Visual Studio 2005 veya 2008'de, Visual C++Project Types altında tıklatın ve Win32 Projectşablonları altında tıklatın. Varsayılan uygulama ayarlarını kabul edin.

Seçenek için Dosya menüsünde farklı bir kayıt eklemek.

  1. Kaynak görünümü ' nü tıklatın ve sonra da IDC_SAVINGDATA çift tıklatın.
  2. Kaydet menü seçeneği, Dosya menüsüne ekleyin. IDM_FILE_SAVEAS menü öğesinin KIMLIĞI olarak kullanın.
  3. Uygulamanın WndProc penceresi SavingData.cppm yordamda bulun ve Kaydet menü seçeneğini işlemek için WM_COMMAND bölüm içinde yeni bir servis talebi deyimini ekleyin. Sonraki bölümde oluşturacağınız OnFileSaveAs işlevini çağırın. Bu işlev parametre olarak al?r.

    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 varsayılan standart dosya Kaydet iletişim kutusunu kullanın

Bir kullanıcı bir uygulamanın Dosya (veya Dosya Aç) iletişim kutusu ilk kez görüntülediğinde, iletişim kutusunu (veya bir alt Belgelerim, görüntü verileri Resimlerim ve Müziklerim ses dosyaları gibi) kullanıcının Belgelerim klasörü varsayılan gerekir.

Not: hiçbir fiziksel konumunu garanti olduğundan, hiçbir zaman sabit bir yol uygulamanızdaki kodu gerekir. Yeniden örneğin, bir yönetici Belgelerim klasörü bir ağ konumuna konumlandırmak.
  1. Deyimler şunlardır SavingData.cpp üstünde ekleyin:
    #include <commdlg.h>   // for GetSaveFileName
    #include <shlobj.h>    // for SHGetFolderPath
    					
  2. OnFileSaveAs işlevi aşağıdaki prototipi ekleyin:
    void OnFileSaveAs( HWND hWnd );
    					
  3. Yeni OnFileSaveAs fonksiyon oluştur. Bu işlev içinde SHGetFolderPath işlevi CSIDL_MYPICTURESCSIDL tanıtıcısı birlikte saklamak için doğru klasör konumunu almak için kullanın veri resim. Bu klasör konumu, standart Dosya görüntülenecek GetSaveFileName işlevine geçirmek iletiş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 Dosya menüsünden farklı Kaydet ' i tıklatın.
  3. CSIDL_MYPICTURES belirtir gibi standart Dosya Kaydet iletişim kutusu, Resimlerim klasörüne varsayılan doğrulayın.
  4. Iletişim kutusunu kapatmak için iptal ' i tıklatın ve sonra da uygulamayı kapatın.

Kullanıcının önceki seçimine unutmayın.

Dosya (veya Dosya Aç) iletişim kutusunda sonraki kullanımı için kullanıcı iletişim kutusunda varsayılan konumunu önceden seçilen önerilir.

OPENFILENAME yapısı içindeki bir başlangıç klasörü konumu belirtmezseniz, Belgelerim klasörüne gösteren standart Dosya veya Dosya Aç iletişim kutusunda, görüntülemek, GetSaveFileName (ve GetOpenFileName). Buna ek olarak, kullanıcı aşağıdaki iletişim kutularından birini daha önce kullandığı varsayılan olmayan bir klasör seçtiğinde, bu işlevler otomatik olarak önceden kullanılan klasöre varsayılan.

Önerilen en iyi yöntem, bir özel bir klasör konumu (örneğin, Resimlerim) ilk kez yönlendirilmesi desteklemek için bir kullanıcı kaydeder veya bir dosyayı yükler ve bu kullanıcının daha önce seçilen konuma sonradan varsayılan olarak, bu kullanıcı Kaydet veya Aç bir işlem yürüttü ilk kez olup olmadığını izlemek için bir Boolean değişkeni kullanmalısınız.
  1. BFirstSaveOnFileSaveAs fonksiyonunda adında bir statik BOOL değişken oluşturmak ve bunu DOğRU olarak başlatılamadı.
  2. BFirstSaveTRUE ise, kod içinde OnFileSaveAsOPENFILENAME yapısının lpstrInitialDir üye SHGetFolderPath arayın ve değiştirin.
  3. KayıtDosya Kaydet iletişim kutusunda, kullanıcı tıklattığında, bFirstSaveYANLıŞ olarak ayarlayın.

    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çimine doğrulayın.

  1. Projeyi derleyin ve uygulamayı çalıştırın.
  2. Dosya menüsünden Farklı Kaydet ' i tıklatın.
  3. Resimlerim klasöründen Belgelerim klasörüne göz atın, klasör, bir dosya seçin ve Kaydet ' i tıklatın.
  4. Dosya menüsünden Farklı Kaydet ' yi yeniden tıklatın.
  5. Önceki seçim (Bu durumda, Belgelerim) için varsayılan iletişim kutusu doğrulayın.
  6. Iletişim kutusunu kapatmak için iptal ' i tıklatın ve sonra da uygulamayı kapatın.
  7. Uygulamayı çalıştırın ve Dosya menüsünden farklı Kaydet ' i tıklatın.
  8. Iletişim kutusunda, geri Resimlerim için varsayılan doğrulama klasör.
  9. Iletişim kutusunu kapatın ve uygulamadan çıkın.

Uygulama verileri sınıflandır

Uygulamaya özel verileri (örneğin, geçici dosyaları, kullanıcı tercihleri, uygulamanın yapılandırma dosyaları vb.) Belgelerim klasöründe saklamalısınız değil. Bunun yerine, uygun bir konuma (64 kilobayt geçmediği veriler için) Windows kayıt defterindeki kullanın veya bir uygulamaya özgü dosya geçerli bir uygulama veri içinde bulunan klasör.

Uygulama verilerini, birçok kişi, birbirlerinin verilerini ve ayarlarını üzerine yazmalarını veya bozulmasını olmadan aynı bilgisayarı kullanmak izin vermek için doğru konumda depolamak önemlidir.

Uygulama verileriniz için en uygun konumunu belirlemek için <a0></a0>, verilerinizi sınıflandırmak için aşağıdaki kategorilere kullanın:
  • Her kullanıcının (gezici): Bu kategori, belirli bir kullanıcıya özgüdür ve Marc olarak kullanıcı tarafından kullanılabilir olması gereken uygulama verilerini açıklar veya Filiz (örneğin, özel bir sözlüğe) bir etki alanındaki bilgisayarlar arasında taşır. Bu ayar etki alanı ortamında çalışacak şekilde tasarlanmamış bir uygulama için geçerli değildir not alın.
  • Her kullanıcının (non-gezici): Bu kategori, belirli bir kullanıcıya özgü, ancak yalnızca tek bir bilgisayar için (örneğin, bir kullanıcı tarafından belirtilen monitör çözünürlüğü) geçerli bir uygulama verilerini açıklar.
  • Her bilgisayar (kullanıcı olmayan özel ve olmayan gezici): Bu kategori, belirli bir bilgisayarın (örneğin, bir uygulama sözlük, bir günlük dosyası veya geçici bir dosya) ve tüm kullanıcılar için geçerlidir, uygulama verilerini açıklar.

Uygulama verileri doğru konuma depolayın.

Doğru Application Data klasörünü almak için SHGetFolderPath işlevini kullanın. Uygulama verileri, doğrudan bu klasöre depolamayın. Bunun yerine, bir alt klasör SHGetFolderPath döndüren yolu eklemek için PathAppend işlevini kullanın. Aşağıdaki yöntemi kullandığınızdan emin olun:
Şirket Name\Product Name\Product sürüm
Örneğin, bir 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ünü bulmak için <a0></a0>, uygulama verilerinizin kategorisine göre uygun CSIDL değeri geçirir.
  • Her kullanıcı için (gezici) veri CSIDL_APPDATA değerini kullanın. Bu varsayılan olarak aşağıdaki yolu:
    \Documents and Settings\ <Kullanıcı adı > \Application veri
  • Her kullanıcı için (non-gezici), veri CSIDL_LOCAL_APPDATA değerini kullanın. Bu varsayılan olarak aşağıdaki yolu:
    \Documents and Settings\ <Kullanıcı adı > \Local Settings\Application Data
  • Her bilgisayar (kullanıcı olmayan özel ve olmayan gezici) veri için CSIDL_COMMON_APPDATA değerini kullanın. Bu varsayılan olarak aşağıdaki yolu:
    \Documents and Settings\All Users\Application veri
Aşağıdaki kod bölümü, CSIDL_COMMON_APPDATA altında bulunan geçici bir günlük dosyası açılamıyor gösterilmiştir:
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 defterinin dikkatli kullanın

Önemli Bu bölüm, yöntem veya görev kayıt defterini nasıl söyleyin adımları içerir. Ancak kayıt defterini hatalı olarak değiştirirseniz önemli sorunlar oluşabilir. Bu nedenle, bu adımları dikkatlice uyguladığınızdan emin olun. Ek koruma için, kayıt defterini değiştirmeden önce yedeklemeyi unutmayın. Bir sorun oluşursa kayıt defterini daha sonra 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  (http://support.microsoft.com/kb/322756/ ) Windows'da kayıt defterini yedekleme ve geri yükleme

Kayıt defteri uygulama verilerinin küçük miktarlarda saklamak için de kullanılabilir. 64 Kilobayt (KB) aşarsa, veriler için bir Application Data klasörünü kullanmanız gerekir. Uygulama verilerini depolamak için kayıt defterini kullanırken, aşağıdaki kurallara uyun:
  • Kullanıcı verileri küçük tutarlar için HKEY_CURRENT_USER (HKCU) kayıt defteri anahtarını kullanın.
  • Bilgisayar verileri küçük tutarlar için HKEY_LOCAL_MACHINE (HKLM) kayıt defteri anahtarını kullanın. Varsayılan olarak, yönetici olmayan kullanıcılar yalnızca HKLM ağacına salt okunur erişime sahip olduğundan, uygulamanız için HKLM zamanında yazsın değil.
  • Yükleme sırasında uygulama en çok 128 KB toplam HKCU ve HKLM depolamalısınız değil.
  • Bileşen Nesne Modeli (COM) bileşenlerini (HKCR) HKEY_CLASSES_ROOT kayıt defteri anahtarının altında kaydedilir. En fazla 128 KB HKCR içermez.
  • HKLM veya HKCU yazdığınızda, şirket adı, ürün adını ve ürün sürüm numarası, tuşları gibi oluşturmalısınız:
    HKLM\Software\Company Name\Product Name\Product sürüm
    HKCU\Software\Company Name\Product Name\Product sürüm
  • Kayıt defteri girdilerini okuyup (örneğin, RegCreateKeyEx ve RegSetValueEx) kayıt defteri işlevlerini kullanın.

SORUN GİDERME

  • Uygulamaları Windows XP'ye yanı sıra, Windows'un önceki sürümlerinde çalışan sağlamak için <a0></a0>, her zaman shfolder.dll SHGetFolderPath uygulamasında bağlayın. Windows XP'de Shell32.dll SHGetFolderPath bulunmasına karşın, Windows'un önceki sürümlerinde, bu dinamik bağlantı kitaplığı (DLL) içindeki fonksiyonun desteklemiyor olabilir.
  • Shfolder.dll yeniden dağıtılabilir bir bileşenidir ve uygulamalarınızı yeniden dağıtılabilir.
  • Tam olarak nitelenmiş yollar depolamayın bir kullanıcı veya yönetici bu klasörler arasında art arda kullanır uygulamanızın yeniden konumlandırmak, çünkü Belgelerim klasörüne klasör (veya diğer sistem klasörlerini) uygulamaya özgü bir yer gibi çoğu dosya listesi içinde son kullanılan dosyalar.

Referanslar

Diğer için üst-isabet Visual C++ .NET Microsoft Knowledge Base makaleleri, Visual C++ .NET Destek Merkezi aşağıdaki Microsoft Web sitesini ziyaret edin:
Visual C++ .NET (2002) Destek Merkezi
http://support.microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet (http://support.microsoft.com/default.aspx?xmlid=fh%3ben-us%3bvcnet)
Visual C++ .NET hakkında daha fazla genel bilgi için aşağıdaki Microsoft Usenet haber grubunu ziyaret edin:
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)
SHGetFolderPath tanımlayan klasörleri kümesinin tamamı hakkında daha fazla bilgi için bkz:, aşağıdaki Microsoft Platform Yazılım Geliştirme Seti (SDK) belgelerine:
csidl
http://msdn.microsoft.com/en-us/library/bb762494.aspx (http://msdn.microsoft.com/en-us/library/bb762494.aspx)
Kabuk genel programlama hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesine bakın:
Kabuk programcıları Kılavuzu
http://msdn2.microsoft.com/en-us/library/bb776778.aspx (http://msdn2.microsoft.com/en-us/library/bb776778.aspx)

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition, Ne zaman ne ile kullanilir:
    • the operating system: Microsoft Windows XP
  • Microsoft Visual C++ .NET 2002 Standard Edition, Ne zaman ne ile kullanilir:
    • the operating system: Microsoft Windows XP
Anahtar Kelimeler: 
kbmt kbhowtomaster kbnewsgrouplink KB310294 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:310294  (http://support.microsoft.com/kb/310294/en-us/ )