Как написать приложение Windows XP, сохраняет данные пользователя и приложения в нужное место с помощью Visual C++

Переводы статьи Переводы статьи
Код статьи: 310294 - Vizualiza?i produsele pentru care se aplic? acest articol.
Важно Эта статья содержит сведения об изменении реестра. Убедитесь, что вы создали резервную копию реестра перед внесением изменений. Убедитесь, что вы знаете, как восстановить реестр в случае возникновения проблем. Для получения дополнительных сведений об архивации, восстановлении и изменении реестра щелкните следующий номер статьи базы знаний Майкрософт:
322756 Как провести резервное копирование и восстановление реестра Windows
Примечание Microsoft Visual C++ .NET 2002, Microsoft Visual C++ .NET 2003, Microsoft Visual C++ 2005 и Microsoft Visual C++ 2008 поддерживает модель управляемого кода, предоставляемые Microsoft платформа.NET Framework и неуправляемым собственной модели кода Microsoft Windows. Информация в данной статье относится только к неуправляемым кодом Visual C++
Развернуть все | Свернуть все

В этой статье

Аннотация

Приложения будут работать с двумя типами документов: те, пользователь создает и те, которые создает приложение. В приложениях следует использовать функцию SHGetFolderPath shell для получения расположения допустимую папку для хранения данных Это специфичные для пользователя и приложения. Это особенно важно для Windows XP приложений для поддержки нескольких пользователей, использующих тот же компьютер и Чтобы пользователи могли быстро переключаться.

В данной статье описывается как хранения данных пользователя в нужное место в следующие действия:
  • Создание приложения Win32.
  • Добавить Сохранить как параметр дляФайл меню.
  • Использовать стандартный Сохранение файла диалоговое окно по умолчанию в нужном месте.
  • Проверьте правильную папку для сохранения файла.
  • Запомнить пользователя предыдущее выделение.
  • Проверьте предыдущее выделение пользователя.
В следующих шагах в этой статье также описывает, где вы необходимо сохранять данные приложения и как убедиться, что он хранится в соответствующие места:
  • Классификация данных приложения.
  • Храните данные приложения в нужное место.
  • Осторожно используйте реестр.

Требования

В следующем списке представлены рекомендуемого оборудования, программного обеспечения, Сетевая инфраструктура, навыки, знания и необходимые пакеты обновления:
  • Windows XP Home Edition или Windows XP Профессиональный
  • Visual Studio 2008, Visual Sudio 2005 или Visual Studio .NET.
  • Знания о разработке приложений Win32

Создание приложения Win32

Запустите Visual Studio и создайте новое приложение Win32 с именем SavingData.
  • В Visual Studio .NET нажмите кнопку Visual C++ Проекты в разделе Типы проектов, а затем нажмите кнопкуПроект Win32 в разделе Шаблоны. Принять по умолчанию параметры приложения, мастер установки приложения Отображает.
  • В Visual Studio 2005 или 2008 нажмите кнопку Visual C++в разделе Типы проектов, а затем нажмите кнопку Win32 Проект в разделе Шаблоны. Примите значения по умолчанию Параметры приложения.

Добавить сохранения как параметр в меню «Файл»

  1. Нажмите кнопку Представление ресурсов, а затем дважды щелкните значок IDC_SAVINGDATA.
  2. Добавить Сохранить как пункт менюФайл меню. IDM_FILE_SAVEAS используйте как идентификатор пункта меню.
  3. Найдите процедуру окна приложения WndProc в SavingData.cppm и добавить новый оператор case в разделе WM_COMMAND для обработки Сохранить как пункт меню. Вызов функция OnFileSaveAs , который будет создан в следующем разделе. Это функция не принимает никаких параметров.

    Код должен выглядеть следующим образом:
    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;
    

С помощью стандартного файла диалоговое окно Сохранить значения по умолчанию в нужном месте

Когда пользователь отображает приложения Сохранение файла(или Открытие файла) диалоговое окно впервые, диалоговое окно «» необходимо по умолчанию для пользователя «Мои документы» (или потомком Мой Документы, например данных изображения Мои рисунки и Моя музыка для аудио файлы).

Примечание: должно не используйте жесткое программирование пути в приложении так как никогда не может гарантировать его физическом расположении. Например администратор может переместить папку «Мои документы» в сетевую папку.
  1. В верхней части SavingData.cpp добавьте следующий include инструкции:
    #include <commdlg.h>   // for GetSaveFileName
    #include <shlobj.h>    // for SHGetFolderPath
    					
  2. Добавьте следующий прототип функции OnFileSaveAs :
    void OnFileSaveAs( HWND hWnd );
    					
  3. Создайте новую функцию OnFileSaveAs . В рамках данной функции используйте функцию SHGetFolderPath в сочетании с идентификатором CSIDL_MYPICTURES CSIDL для получения правильную папку для хранения данные изображения. Передача в эту папку появившиеся функции для отображения стандартного Сохранение файладиалоговое окно.

    Код должен выглядеть следующим образом:
    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.
        }
    }
    

Проверьте правильную папку для сохранения файла

  1. Нажмите клавишу F5 для построения проекта.
  2. Запустите приложение и нажмите кнопку Сохранить какиз Файл меню.
  3. Убедитесь, что стандартный Сохранение файла диалоговое окно поле по умолчанию «Мои рисунки», как CSIDL_MYPICTURES .
  4. Нажмите кнопку Отмена Чтобы закрыть диалоговое окно и Закройте приложение.

Не забывайте предыдущего выбора пользователя

Для последующего использования Сохранение файла (или Открытие файла) диалоговое окно, рекомендуется диалоговом окне по умолчанию для пользователя ранее выбранного расположения.

Если этого не сделать Укажите начальную папку в структуре OPENFILENAME , появившиесявыглядят) отображения стандартного Сохранение файла или Файл Открыть диалоговое окно «», который указывает на папку «Мои документы». Кроме того, Если пользователь использовал одну из этих диалоговых ранее и выбрал по умолчанию папка по умолчанию эти функции автоматически используется ранее использовать папки.

Для поддержки рекомендуется целевых определенные папки (например, Мои рисунки) в первый раз пользователь сохраняет или загружает файл, а затем по умолчанию для пользователя ранее выбранные расположение, следует использовать логическую переменную для отслеживания ли это первое время пользователь выполнил сохранить или открыть операции.
  1. Создайте переменную статического типа BOOL с именем bFirstSave в функции OnFileSaveAs и инициализировать его в значение TRUE.
  2. Измените код в OnFileSaveAs для вызова SHGetFolderPath член lpstrInitialDir структуры OPENFILENAME , только если bFirstSave имеет значение TRUE.
  3. При нажатии кнопки Сохранить вСохранение файла диалоговое окно, набор bFirstSave дляЗНАЧЕНИЕ FALSE.

    Код должен выглядеть следующим образом:
    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.
        }
    }
    

Проверьте предыдущее выделение пользователя

  1. Выполните построение проекта и запустите приложение.
  2. Из Файл меню, нажмите кнопку Сохранить Как.
  3. Перейдите в папку Мои документы из папки «Мои рисунки» папки, выберите файл и нажмите кнопку Сохранить.
  4. Из Файл меню, нажмите кнопку Сохранить Как еще раз.
  5. Убедитесь, что поле диалогового окна значения по умолчанию для предыдущих Выбор (в данном случае, Мои документы).
  6. Нажмите кнопку Отмена Чтобы закрыть диалоговое окно, и закройте приложение.
  7. Запустите приложение и нажмите кнопку Сохранить какиз Файл меню.
  8. Убедитесь, что поле диалогового окна по умолчанию для «Мои рисунки» папка.
  9. Закройте диалоговое окно и выйти из приложения.

Классификация данных приложения

Не следует хранить данные приложения (например, временный файлы, настройки пользователя, файлы конфигурации приложений и т. д.) в моем Папка «документы». Вместо этого используйте соответствующее место в Windows Реестр (для данных, не должна превышать 64 КБ) или файл приложения, расположенный в допустимых данных приложения папка.

Это важно для сохранения данных приложения с верной расположение позволяет использовать тот же компьютер не повредив несколько людям или перезапись данных и параметры друг друга.

Чтобы определить наиболее подходящие место для данных приложения, используйте следующие категории для классифицировать данные:
  • Для каждого пользователя (перемещения): описание данных приложения, относящиеся к этой категории конкретного пользователя и должен быть доступен для пользователя, как он или она перемещается между компьютеры в домене (например, словарь пользователя). Обратите внимание, на которые параметр не применяется к приложениям, которые не предназначены для работы в домене Среда.
  • Для каждого пользователя (неперемещающегося): описание данных приложения, относящиеся к этой категории но конкретного пользователя применяется только на одном компьютере (например, разрешение монитора, определяемые пользователем).
  • Для каждого компьютера (не пользователя и не перемещающегося): описание этой категории данных приложения, применяется ко всем пользователи и к конкретному компьютеру (например, словарь приложения, журнал файл, или временный файл).

Храните данные приложения в нужное место

Используйте функцию SHGetFolderPath для получения правильной папке данных приложения. Нет Храните данные приложения непосредственно в эту папку. Вместо этого используйте функцию PathAppend для добавления к пути, SHGetFolderPath возвращает вложенную папку. Убедитесь, что используются следующие обозначения:
Компания Name\Product Name\Product версия
Например результирующий путь может выглядеть следующим образом:
\Documents and Settings\All Users\Application Data\My Company\My Product\1.0
Чтобы найти нужную папку данных приложения, передачи соответствующее значение CSIDL , на основе категории данных приложения.
  • Для каждого пользователя (перемещаемый) данных, используйте значение CSIDL_APPDATA . По умолчанию используется следующий путь:
    \Documents and появляетсяимя пользователя> \Application Data
  • Для каждого пользователя (неперемещающегося) данных, используйте значение CSIDL_LOCAL_APPDATA . По умолчанию используется следующий путь:
    \Documents and появляетсяимя пользователя> \Local Settings\Application данных
  • Для каждого компьютера (не пользователя и не перемещающегося) данных Используйте значение CSIDL_COMMON_APPDATA . По умолчанию используется следующий путь:
    \Documents and Settings\All Users\Application данных
В следующем фрагменте кода показано, как открыть временный файл журнала, который находится под 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();
   }
}

Осторожно с помощью реестра

Важно Этот раздел, метод или задача содержит действия, о том, как внести изменения в реестр. Однако при неправильном изменении реестра могут возникнуть серьезные проблемы. Поэтому точно выполняйте следующие действия. Для дополнительной защиты создайте резервную копию реестра перед внесением изменений. Затем при возникновении неполадок можно восстановить реестр. Для дополнительных сведений о способах создания резервной копии и восстановлении реестра щелкните следующий номер статьи базы знаний Майкрософт:
322756 Как провести резервное копирование и восстановление реестра Windows

Также могут использовать реестр для хранения небольших объемы данных приложения. Для данных, превышает 64 килобайта (КБ) необходимо Используйте папку данных приложения. Соблюдайте следующие правила при использовании реестр для хранения данных приложения:
  • Для небольших объемов данных пользователя используйте раздел реестра HKEY_CURRENT_USER (HKCU).
  • Для небольших объемов данных на компьютере используйте раздел реестра HKEY_LOCAL_MACHINE (HKLM). Приложение не следует писать в HKLM во время выполнения, поскольку по умолчанию только пользователи без прав администратора иметь доступ только для чтения к дереву HKLM .
  • Во время установки приложения не должен хранить несколько чем общим объемом 128 КБ HKCU и HKLM.
  • Зарегистрированные компоненты компонента модели объектов (COM) раздел реестра HKEY_CLASSES_ROOT (HKCR). Максимум 128 КБ включает HKCR.
  • При написании HKLM или HKCU, необходимо создать разделы для название компании, название продукта, и номер версии продукта, как показано ниже:
    Версия Name\Product Name\Product HKLM\Software\Company
    Версия Name\Product Name\Product HKCU\Software\Company
  • Используйте функции реестра (например, RegCreateKeyEx и RegSetValueEx) для чтения и записи реестра.

Устранение неполадок

  • Чтобы убедиться, что приложения работают в более ранних версиях Реализация SHGetFolderPath в Shfolder.dll всегда связать Windows и Windows XP. Хотя Windows XP включает в себя SHGetFolderPath в Shell32.dll, более ранние версии Windows может не поддерживать функции библиотеки динамической компоновки (DLL).
  • Shfolder.dll распространяемый компонент и могут быть распространять с приложениями.
  • Не храните полные пути в папку Мои документы папка (или другие системные папки) в пределах конкретного приложения установите такие как файл списка недавно открывавшихся файлов, так как пользователь или администратор может Перемещение этих папок между последовательными использует приложение.

Ссылки

Для других верхней попаданий Visual C++ .NET Microsoft Knowledge Base статьи, посетите Центр поддержки Visual C++ .NET в следующем корпорации Майкрософт Веб-узел:
Центр поддержки Visual C++ .NET (2002)
http://support.Microsoft.com/default.aspx?xmlid=fh%3BEN-US%3Bvcnet
Дополнительные сведения о полном наборе папок, можно определить SHGetFolderPath см ниже программной платформы корпорации Майкрософт Документации пакет средств разработки:
CSIDL
http://MSDN.Microsoft.com/en-us/library/bb762494.aspx
Дополнительные сведения об оболочке программирования в целом см. следующий веб-узел Microsoft Developer Network (MSDN):
Руководство по программистов оболочки
http://msdn2.Microsoft.com/en-us/library/bb776778.aspx

Свойства

Код статьи: 310294 - Последний отзыв: 29 ноября 2012 г. - Revision: 6.0
Информация в данной статье относится к следующим продуктам.
  • 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
Ключевые слова: 
kbhowtomaster kbnewsgrouplink kbmt KB310294 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: 310294

Отправить отзыв

 

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