Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để viết một ứng dụng XP cửa sổ lưu trữ dữ liệu người sử dụng và ứng dụng trong vị trí chính xác bằng cách sử dụng Visual C ++

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 310294
Quan trọng Bài viết này chứa thông tin về làm thế nào để sửa đổi sổ kiểm nhập. Đảm bảo rằng bạn sao lưu sổ kiểm nhập trước khi bạn sửa đổi nó. Hãy chắc chắn rằng bạn biết làm thế nào để khôi phục sổ kiểm nhập nếu một vấn đề xảy ra. Để biết thêm chi tiết về làm thế nào để sao lưu, khôi phục và sửa đổi sổ kiểm nhập, nhấp vào số bài viết sau để xem bài viết trong cơ sở kiến thức Microsoft:
322756 Làm thế nào để sao lưu và khôi phục sổ kiểm nhập trong Windows
Lưu ý Microsoft Visual C++ .NET 2002, Microsoft Visual C++ Studio.net 2003, Microsoft Visual C++ 2005 và Microsoft Visual C++ 2008 hỗ trợ cả hai mô hình mã được quản lý được cung cấp bởi Microsoft Khuôn khổ .NET và các mô hình mã nguồn gốc không được quản lý Microsoft Windows. Thông tin trong bài viết này chỉ áp dụng cho không được quản lý Visual C ++ mã
Tóm tắt
Ứng dụng làm việc với hai loại tài liệu: những người mà người dùng tạo và những người mà tạo ra các ứng dụng. Ứng dụng của bạn nên sử dụng các chức năng bao SHGetFolderPath để lấy cặp hợp lệ địa điểm để lưu trữ dữ liệu đó là cụ thể cho người dùng và các ứng dụng. Đây là điều cần thiết cho Windows Ứng dụng XP hỗ trợ nhiều người dùng đang sử dụng cùng một máy tính và để cho phép người dùng chuyển đổi nhanh chóng.

Bài viết này mô tả làm thế nào để lưu trữ dữ liệu người dùng trong vị trí chính xác trong các bước sau:
  • Tạo một ứng dụng Win32.
  • Thêm một Lưu như tùy chọn cho cácTập tin trình đơn.
  • Sử dụng các tiêu chuẩn Tập tin tiết kiệm hộp thoại để mặc định vị trí chính xác.
  • Kiểm tra các tập tin chính xác lưu vị trí.
  • Hãy nhớ rằng lựa chọn trước đó của người dùng.
  • Xác minh lựa chọn trước đó của người dùng.
Trong các bước sau, bài viết này cũng mô tả nơi bạn phải lưu trữ dữ liệu ứng dụng và làm thế nào để đảm bảo rằng nó được lưu trữ trong các vị trí thích hợp:
  • Phân loại dữ liệu ứng dụng.
  • Lưu trữ dữ liệu ứng dụng ở vị trí chính xác.
  • Sử dụng registry khôn ngoan.

Yêu cầu

Danh sách sau đây tóm tắt các phần cứng được đề nghị, phần mềm, mạng lưới cơ sở hạ tầng, kỹ năng, kiến thức, và bản ghi dịch vụ gói mà bạn cần:
  • Windows XP Home Edition hoặc Windows XP Chuyên nghiệp
  • Visual Studio 2008, trực quan Sudio năm 2005 hoặc Visual Studio net.
  • Kiến thức trước khi phát triển ứng dụng Win32

Tạo một ứng dụng Win32

Bắt đầu Visual Studio và tạo ra một ứng dụng Win32 Mới đặt tên SavingData.
  • Trong Visual Studio .NET, hãy nhấp vào Visual C ++ Dự án theo Các loại dự án, và sau đó nhấp vàoWin32 dự án theo Mẫu. Chấp nhận các cài đặt chuyên biệt ứng dụng mặc định các ứng dụng thiết lập thuật sĩ Hiển thị.
  • Trong Visual Studio 2005 hay 2008, hãy nhấp vào Visual C ++theo Các loại dự án, và sau đó nhấp vào Win32 Dự án theo Mẫu. Chấp nhận mặc định cài đặt chuyên biệt ứng dụng.

Thêm một lưu như các tùy chọn Menu tập tin

  1. Bấm chuột Xem tài nguyên, và sau đó bấm đúp IDC_SAVINGDATA.
  2. Thêm một Lưu như tùy chọn trình đơn để cácTập tin trình đơn. Sử dụng IDM_FILE_SAVEAS như ID của mục trình đơn.
  3. Xác định vị trí của ứng dụng WndProc cửa sổ thủ tục trong SavingData.cppm và thêm một tuyên bố trường hợp mới trong phần WM_COMMAND để xử lý các Lưu như trình đơn tùy chọn. Cuộc gọi Các OnFileSaveAs chức năng, mà bạn sẽ tạo ra trong phần tiếp theo. Điều này chức năng mất không tham biến.

    Mã của bạn sẽ xuất hiện như sau:
    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;

Sử dụng tiêu chuẩn tập tin lưu hộp thoại để mặc định vị trí chính xác

Khi một người sử dụng sẽ hiển thị một ứng dụng Tập tin tiết kiệm(hoặc Mở tập tin) hộp thoại cho lần đầu tiên, các hộp phải mặc định mục tin thư thoại My Documents của người dùng (hoặc hậu duệ của tôi Tài liệu, chẳng hạn như các hình ảnh của tôi cho dữ liệu hình ảnh và Âm nhạc của tôi cho âm thanh các tập tin).

Lưu ý: bạn không bao giờ hết phải mã một con đường trong ứng dụng của bạn bởi vì bạn không bao giờ có thể đảm bảo vị trí vật lý của nó. Ví dụ, người quản trị có thể di chuyển Cặp Tài liệu của tôi đến một vị trí mạng.
  1. Ở trên đầu cửa sổ SavingData.cpp trình đơn, thêm bao gồm sau đây báo cáo:
    #include <commdlg.h>   // for GetSaveFileName#include <shlobj.h>    // for SHGetFolderPath					
  2. Thêm mẫu sau đây cho các chức năng OnFileSaveAs :
    void OnFileSaveAs( HWND hWnd );					
  3. Tạo ra các chức năng OnFileSaveAs mới. Trong chức năng này, dùng chức năng SHGetFolderPath kết hợp với các định danh CSIDLCSIDL_MYPICTURES để lấy vị trí mục tin thư thoại chính xác để lưu trữ dữ liệu hình ảnh. Vượt qua vị trí mục tin thư thoại này với các chức năng GetSaveFileName để hiển thị các tiêu chuẩn Tập tin tiết kiệmhộp thoại.

    Mã của bạn sẽ xuất hiện như sau:
    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.    }}

Kiểm chứng lại tệp chính xác lưu vị trí

  1. Bấm phím F5 để xây dựng các dự án.
  2. Chạy các ứng dụng, và nhấp vào Lưu nhưtừ các Tập tin trình đơn.
  3. Xác minh rằng các tiêu chuẩn Tập tin tiết kiệm hộp thoại hộp mặc định vào mục tin thư thoại ảnh của tôi, vì CSIDL_MYPICTURES chỉ định.
  4. Bấm chuột Hủy bỏ để đóng hộp thoại, và đóng ứng dụng.

Hãy nhớ rằng lựa chọn trước đó của người dùng

Sau đó sử dụng các Tập tin tiết kiệm (hoặc Mở tập tin) hộp thoại, đó khuyến cáo rằng hộp thoại mặc định của người dùng đã chọn vị trí.

Nếu bạn không cung cấp vị trí mục tin thư thoại đầu tiên trong cơ cấu OPENFILENAME , GetSaveFileName (và GetOpenFileName) sẽ hiển thị các tiêu chuẩn Tập tin tiết kiệm hoặc Tập tin Mở hộp thoại, mà điểm đến mục tin thư thoại My Documents. Ngoài ra Nếu người dùng đã sử dụng một trong các hộp trước đây và đã chọn một mục tin thư thoại không mặc định, các chức năng tự động mặc định cho các trước đó sử dụng mục tin thư thoại.

Để hỗ trợ thực hành tốt nhất được giới thiệu nhắm mục tiêu một vị trí mục tin thư thoại cụ thể (chẳng hạn như hình ảnh của tôi) lần đầu tiên một người sử dụng tiết kiệm hoặc tải một tập tin, và sau đó mặc định của người dùng trước đó đã chọn vị trí, bạn nên sử dụng một biến Boolean để theo dõi cho dù đây là lần đầu tiên thời gian người dùng đã thực hiện lưu hoặc mở các hoạt động.
  1. Tạo ra một biến tĩnh BOOL tên là bFirstSave trong các chức năng OnFileSaveAs , và khởi tạo nó thành TRUE.
  2. Thay đổi mã trong OnFileSaveAs để gọi SHGetFolderPath và thiết lập các thành viên lpstrInitialDir của cấu trúc OPENFILENAME , chỉ nếu bFirstSaveđúng sự thật.
  3. Nếu người dùng Bấm chuột Tiết kiệm trong cácTập tin tiết kiệm hộp thoại, thiết lập bFirstSave đểSAI.

    Mã của bạn sẽ xuất hiện như sau:
    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.    }}

Xác minh lựa chọn trước đó của người dùng

  1. Xây dựng dự án, bật lên và chạy các ứng dụng.
  2. Từ các Tập tin trình đơn, nhấp vào Tiết kiệm Như.
  3. Trình duyệt từ cặp ảnh của tôi vào các Tài liệu của tôi mục tin thư thoại, chọn một tập tin và nhấp vào Tiết kiệm.
  4. Từ các Tập tin trình đơn, nhấp vào Tiết kiệm Như một lần nữa.
  5. Xác minh rằng hộp thoại mặc định trước đây của bạn lựa chọn (trong trường hợp này, tài liệu của tôi).
  6. Bấm chuột Hủy bỏ để bỏ qua hộp thoại, và đóng ứng dụng.
  7. Chạy các ứng dụng, và nhấp vào Lưu nhưtừ các Tập tin trình đơn.
  8. Xác minh rằng hộp thoại mặc định quay lại hình ảnh của tôi mục tin thư thoại.
  9. Đóng hộp thoại và thoát khỏi ứng dụng.

Phân loại dữ liệu ứng dụng

Bạn không nên lưu trữ dữ liệu-ứng dụng (chẳng hạn như tạm thời tập tin, sở thích người dùng, tập tin cấu hình ứng dụng và vv) trong các của tôi Cặp tài liệu. Thay vào đó, sử dụng một trong hai vị trí thích hợp trong các cửa sổ kiểm nhập (đối với các dữ liệu không vượt quá 64 kB) hoặc một dành riêng cho ứng dụng tập tin nằm trong một dữ liệu ứng dụng hợp lệ mục tin thư thoại.

Nó là quan trọng để lưu trữ dữ liệu ứng dụng chính xác vị trí để cho phép một số người sử dụng cùng một máy tính mà không corrupting hoặc ghi đè dữ liệu của nhau và cài đặt chuyên biệt.

Để xác định những thích hợp cho dữ liệu ứng dụng của bạn, sử dụng các danh mục sau đây để phân loại dữ liệu của bạn:
  • Cho mỗi người dùng (chuyển): thể loại này mô tả dữ liệu ứng dụng cụ thể cho một người dùng cụ thể và nên có sẵn cho người dùng khi họ di chuyển giữa Các máy tính trong một tên miền (ví dụ, là một từ điển tùy chỉnh). Lưu ý rằng điều này thiết lập không áp dụng cho các ứng dụng không được thiết kế để chạy trong một tên miền môi trường.
  • Cho mỗi người dùng (không chuyển): thể loại này mô tả dữ liệu ứng dụng cụ thể cho một người dùng cụ thể nhưng chỉ áp dụng cho một máy tính duy nhất (ví dụ, một xác định người sử dụng màn hình giải quyết).
  • Cho mỗi máy tính (không phải là người dùng cụ thể và không chuyển vùng): thể loại này mô tả dữ liệu ứng dụng áp dụng cho tất cả người dùng và máy tính cụ thể (ví dụ, một từ điển ứng dụng, một kí nhập tập tin, hoặc một tập tin tạm thời).

Lưu trữ dữ liệu ứng dụng ở vị trí chính xác

Bạn sử dụng các chức năng SHGetFolderPath để lấy các mục tin thư thoại dữ liệu ứng dụng chính xác. Không lưu trữ dữ liệu ứng dụng trực tiếp trong mục tin thư thoại này. Thay vào đó, sử dụng các chức năng PathAppend để thêm một mục tin thư thoại con để con đường SHGetFolderPath trở về. Hãy chắc chắn rằng bạn sử dụng công ước sau:
Công ty Name\Product Name\Product Phiên bản
Ví dụ, đường dẫn đầy đủ kết quả có thể xuất hiện như sau:
\Documents và Settings\All Users\Application Data\My Company\My Product\1.0
Xác định vị trí mục tin thư thoại ứng dụng dữ liệu chính xác, vượt qua các giá trị CSIDL thích hợp, dựa trên các loại dữ liệu ứng dụng của bạn.
  • Cho mỗi người dùng dữ liệu (di động), sử dụng giá trị CSIDL_APPDATA . Điều này mặc định đường dẫn sau đây:
    \Documents và Settings\sử dụng tên> \Application dữ liệu
  • Cho mỗi người dùng dữ liệu (không chuyển vùng), sử dụng giá trị CSIDL_LOCAL_APPDATA . Điều này mặc định đường dẫn sau đây:
    \Documents và Settings\sử dụng tên> \Local Settings\Application dữ liệu
  • Cho mỗi dữ liệu máy tính (không phải là người dùng cụ thể và không chuyển vùng), sử dụng giá trị CSIDL_COMMON_APPDATA . Điều này mặc định đường dẫn sau đây:
    \Documents và Settings\All Users\Application dữ liệu
Đoạn mã sau đây chứng minh làm thế nào để mở một kí nhập tệp tạm thời, mà nằm bên dưới 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();   }}

Sử dụng Registry khôn ngoan

Quan trọng Phần, phương pháp, hoặc công việc có bước mà cho bạn biết làm thế nào để sửa đổi sổ kiểm nhập. Tuy nhiên, vấn đề nghiêm trọng có thể xảy ra nếu bạn sửa đổi registry không chính xác. Vì vậy, hãy chắc chắn rằng bạn làm theo các bước sau một cách cẩn thận. Để bảo vệ bổ sung, sao lưu sổ kiểm nhập trước khi bạn sửa đổi nó. Sau đó, bạn có thể khôi phục sổ kiểm nhập nếu một vấn đề xảy ra. Để biết thêm chi tiết về làm thế nào để sao lưu và khôi phục sổ kiểm nhập, nhấp vào số bài viết sau để xem bài viết trong cơ sở kiến thức Microsoft:
322756 Làm thế nào để sao lưu và khôi phục sổ kiểm nhập trong Windows

Bạn cũng có thể sử dụng sổ kiểm nhập để lưu trữ nhỏ số lượng dữ liệu ứng dụng. Dữ liệu vượt quá 64 kilobyte (KB), bạn phải sử dụng một mục tin thư thoại Application Data. Quan sát các hướng dẫn sau khi bạn sử dụng kiểm nhập để lưu trữ dữ liệu ứng dụng:
  • Đối với một lượng nhỏ dữ liệu người dùng, sử dụng các khóa registry HKEY_CURRENT_USER (HKCU).
  • Đối với một lượng nhỏ dữ liệu máy tính, sử dụng các khóa registry HKEY_LOCAL_MACHINE (HKLM). Ứng dụng của bạn sẽ không phải viết thư cho HKLM tại thời gian chạy bởi vì, theo mặc định, không phải là người quản trị người dùng chỉ có quyền truy cập chỉ đọc vào cây HKLM .
  • Tại thời điểm cài đặt chuyên biệt, ứng dụng của bạn không phải lưu trữ nhiều hơn nữa so với tổng số 128 KB trên HKCUHKLM.
  • Thành phần đối tượng mô hình (COM) thành phần được kiểm nhập bên dưới khoá kiểm nhập HKEY_CLASSES_ROOT (HKCR). Tối đa của 128 KB không bao gồm các HKCR.
  • Khi bạn viết thư cho HKLM hoặc HKCU, bạn phải tạo phím cho tên công ty, tên sản phẩm, và sản phẩm số phiên bản, như sau:
    Phiên bản Name\Product HKLM\Software\Company Name\Product
    Phiên bản Name\Product HKCU\Software\Company Name\Product
  • Sử dụng các chức năng cơ quan kiểm nhập (ví dụ như RegCreateKeyExRegSetValueEx) để đọc và viết mục kiểm nhập.

Khắc phục sự cố

  • Để giúp đảm bảo rằng các ứng dụng chạy trên các phiên bản trước của Các cửa sổ bên cạnh Windows XP, luôn luôn liên kết để thực hiện SHGetFolderPath ở Shfolder.dll. Mặc dù Windows XP bao gồm SHGetFolderPath trong Shell32.dll, các phiên bản trước của Windows có thể không hỗ trợ các chức năng trong này thư viện liên kết động (DLL).
  • Shfolder.dll là một thành phần redistributable và có thể phân phối với các ứng dụng của bạn.
  • Không lưu trữ đường dẫn đủ điều kiện để các Tài liệu của tôi mục tin thư thoại (hoặc các mục tin thư thoại hệ thống khác) trong một ứng dụng cụ thể đặt như một danh sách tập tin của hầu hết mới sử dụng tập tin vì người dùng hoặc người quản trị có thể di chuyển các mục tin thư thoại giữa các ứng dụng tiếp theo của ứng dụng của bạn.
Tham khảo
Cho khác hàng đầu đạt Visual C++ net Microsoft Knowledge Base Bài viết, thăm Trung tâm hỗ trợ Visual C++ net tại Microsoft sau đây Trang web:
Trung tâm hỗ trợ Visual C ++ net (2002)
http://support.Microsoft.com/default.aspx?xmlid=FH%3BEN-US%3Bvcnet
Để biết thêm chi tiết về bộ hoàn chỉnh các SHGetFolderPath có thể xác định các mục tin thư thoại, hãy xem phần mềm nền tảng sau đây của Microsoft ««Phát triển Kit (SDK) tài liệu: Để biết thêm chi tiết về vỏ lập trình nói chung, hãy xem các web site Microsoft Developer Network (MSDN) sau đây:

Cảnh báo: Bài viết này đã được dịch tự động

Thuộc tính

ID Bài viết: 310294 - Xem lại Lần cuối: 07/20/2013 15:26:00 - Bản sửa đổi: 3.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 KbMtvi
Phản hồi
ype="text/javascript"> Asimov.clickstreamTracker.init();