HOWTO: 올바른 위치에 사용자 및 응용 프로그램 데이터를 저장하는 Windows XP 응용 프로그램 작성

기술 자료 번역 기술 자료 번역
기술 자료: 310294 - 이 문서가 적용되는 제품 보기.
이 문서는 이전에 다음 ID로 출판되었음: KR310294
모두 확대 | 모두 축소

이 페이지에서

요약

응용 프로그램은 두 종류의 문서, 즉 사용자가 만드는 문서와 응용 프로그램 자체에서 만드는 문서로 작동합니다. 응용 프로그램은 SHGetFolderPath 셸 함수를 사용하여 사용자와 응용 프로그램에 관련된 데이터를 저장할 유효한 폴더 위치를 검색해야 합니다. 이것은 같은 컴퓨터를 여러 사용자가 공유하는 기능과 빠른 사용자 전환 기능을 지원해야 하는 Windows XP 응용 프로그램에서는 필수적입니다.

이 문서에서는 올바른 위치에 사용자 데이터를 저장하는 방법을 다음과 같은 단계로 설명합니다.
  • Win32 응용 프로그램을 만듭니다.
  • 파일 메뉴에 다른 이름으로 저장 옵션을 추가합니다.
  • 올바른 위치를 기본값으로 갖는 표준 파일 저장 대화 상자를 사용합니다.
  • 올바른 파일 저장 위치를 확인합니다.
  • 사용자의 이전 선택 위치를 저장합니다.
  • 사용자의 이전 선택 위치를 확인합니다.
또한 응용 프로그램 데이터를 저장하는 위치와 적절한 위치에 저장되었는지 확인하는 방법도 다음과 같은 단계로 설명합니다.
  • 응용 프로그램 데이터를 분류합니다.
  • 올바른 위치에 응용 프로그램 데이터를 저장합니다.
  • 레지스트리를 신중하게 사용합니다.

요구 사항

다음은 권장 하드웨어, 소프트웨어, 네트워크 인프라, 기술과 지식 및 서비스 팩입니다.
  • Windows XP Home Edition 또는 Windows XP Professional
  • Visual Studio .NET 또는 Visual Studio 버전 6.0
  • Win32 응용 프로그램 개발에 대한 사전 지식

Win32 응용 프로그램 만들기

Visual Studio를 시작하고 SavingData라는 이름의 새로운 Win32 응용 프로그램을 만듭니다.
  • Visual C++ 6.0에서 사용 가능한 프로젝트 형식 목록에서 Win32 Application을 누른 다음 A typical "Hello World" application 옵션을 선택합니다.
  • Visual Studio .NET의 프로젝트 형식에서 Visual C++ 프로젝트를 누른 다음 템플릿에서 Win32 프로젝트를 누릅니다. 응용 프로그램 마법사에 나타나는 기본 응용 프로그램 설정을 그대로 적용합니다.

파일 메뉴에 다른 이름으로 저장 옵션 추가

  1. 리소스 뷰를 누른 다음 IDC_SAVINGDATA를 두 번 누릅니다.
  2. 파일 메뉴에 다른 이름으로 저장 메뉴 옵션을 추가합니다. 메뉴 항목의 ID로 IDM_FILE_SAVEAS를 사용합니다.
  3. SavingData.cppm 내에서 응용 프로그램의 WndProc 창 프로시저를 찾고 WM_COMMAND 섹션 내에 다른 이름으로 저장 메뉴 옵션을 처리하는 새로운 case 문을 추가합니다. 다음 절에서 만드는 OnFileSaveAs 함수를 호출합니다. 이 함수는 매개 변수를 사용하지 않습니다.

    코드는 다음과 같이 나타나야 합니다.
    case WM_COMMAND:
       wmId    = LOWORD(wParam); 
       wmEvent = HIWORD(wParam); 
       // Parse the menu selections.
       switch (wmId)
       {
       case IDM_ABOUT:
          DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
          break;
       case IDM_EXIT:
          DestroyWindow(hWnd);
          break;
       case IDM_FILE_SAVEAS:
          OnFileSaveAs();
          break;
       default:
          return DefWindowProc(hWnd, message, wParam, lParam);
       }
       break;

올바른 위치를 기본값으로 갖는 표준 파일 저장 대화 상자 사용

사용자가 응용 프로그램의 파일 저장(또는 파일 열기) 대화 상자를 처음으로 표시하면 대화 상자는 사용자의 내 문서 폴더(또는 이미지 데이터의 경우 My Pictures 및 오디오 파일의 경우 My Music 폴더)가 기본값이 되어야 합니다.

참고: 실제 위치를 확신할 수 없으므로 응용 프로그램 내에 경로를 하드 코딩해서는 안됩니다. 예를 들어, 관리자가 내 문서 폴더를 네트워크상으로 위치 변경할 수도 있습니다.
  1. SavingData.cpp 맨 위에 다음 포함 문을 추가합니다.
    #include <commdlg.h>   // for GetSaveFileName
    #include <shlobj.h>    // for SHGetFolderPath
  2. OnFileSaveAs 함수에 대해 다음 프로토타입을 추가합니다.
    void OnFileSaveAs();
  3. 새로운 OnFileSaveAs 함수를 만듭니다. 이 함수 내에서 CSIDL_MYPICTURESCSIDL 식별자와 함께 SHGetFolderPath 함수를 사용하여 그림 데이터를 저장할 올바른 폴더 위치를 검색합니다. 이 폴더 위치를 GetSaveFileName 함수에 전달하여 표준 파일 저장 대화 상자를 표시합니다.

    코드는 다음과 같이 나타나야 합니다.
    void OnFileSaveAs()
    {
       OPENFILENAME openFile;
       TCHAR szPath[MAX_PATH];
    
    // Initialize OPENFILENAME structure.
    ZeroMemory( &openFile, sizeof(OPENFILENAME) );
    openFile.lStructSize = sizeof(OPENFILENAME);
    // 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이 저장한 My Pictures 폴더입니다.
  4. 취소를 눌러 대화 상자를 닫고 응용 프로그램을 닫습니다.

사용자의 이전 선택 위치 저장

파일 저장(또는 파일 열기) 대화 상자를 계속 사용하는 경우 대화 상자는 사용자가 이전에 선택한 위치를 기본적으로 표시하는 것이 좋습니다.

OPENFILENAME 구조 내에 초기 폴더 위치를 제공하지 않은 경우 GetSaveFileName(및 GetOpenFileName)은 내 문서 폴더를 가리키는 표준 파일 저장 또는 파일 열기 대화 상자를 표시합니다. 뿐만 아니라, 사용자가 이전에 파일 저장 또는 파일 열기 대화 상자를 사용할 때 기본값이 아닌 폴더를 선택한 경우 함수는 이전에 사용한 폴더를 자동으로 표시합니다.

사용자가 처음 파일을 열거나 저장할 때는 My Pictures와 같이 기본 폴더 위치를 표시하게 하고, 이전에 파일을 열고 저장한 적이 있으면 해당 위치를 기억하여 표시하도록 하려면 부울 변수를 사용하여 파일 저장이나 파일 열기 작업이 처음 수행되는 것인지 여부를 추적해야 합니다.
  1. OnFileSaveAs 함수에 bFirstSave라는 이름의 static BOOL 변수를 만들고 TRUE로 초기화합니다.
  2. bFirstSaveTRUE인 경우에만 SHGetFolderPath를 호출하고 OPENFILENAME 구조의 lpstrInitialDir 멤버를 설정하도록 OnFileSaveAs 내의 코드를 수정합니다 .
  3. 사용자가 파일 저장 대화 상자에서 저장을 누르면 bFirstSaveFALSE로 설정합니다.

    코드는 다음과 같이 나타나야 합니다.
    void OnFileSaveAs()
    {
       OPENFILENAME openFile;
       TCHAR szPath[MAX_PATH];
       static BOOL bFirstSave = TRUE;
    
    // Initialize OPENFILENAME structure.
    ZeroMemory( &openFile, sizeof(OPENFILENAME) );
    openFile.lStructSize = sizeof(OPENFILENAME);
    // 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. My Pictures 폴더에서 내 문서 폴더로 이동하고 파일을 선택한 다음 저장을 누릅니다.
  4. 파일 메뉴에서 다른 이름으로 저장을 다시 누릅니다.
  5. 대화 상자의 기본 위치가 이전에 선택한 위치(이 경우 내 문서 폴더)인지 확인합니다.
  6. 취소를 눌러 대화 상자를 닫고 응용 프로그램을 닫습니다.
  7. 응용 프로그램을 실행하고 파일 메뉴에서 다른 이름으로 저장을 누릅니다.
  8. 대화 상자의 기본 위치가 다시 My Pictures 폴더가 되었는지 확인합니다.
  9. 대화 상자를 닫고 응용 프로그램을 종료합니다.

응용 프로그램 데이터 분류

응용 프로그램 관련 데이터(임시 파일, 사용자 기본 설정, 응용 프로그램 구성 파일 등)는 내 문서 폴더에 저장해서는 안됩니다. 대신 Windows 레지스트리(64KB를 초과하지 않는 데이터의 경우)의 적절한 위치나 유효한 Application Data 폴더에 응용 프로그램 관련 파일을 사용하십시오.

여러 사람이 서로의 데이터와 설정을 손상시키거나 덮어쓰지 않고 같은 컴퓨터를 사용할 수 있도록 올바른 위치에 응용 프로그램 데이터를 저장하는 것이 중요합니다.

응용 프로그램 데이터에 가장 적합한 위치를 확인하려면 다음 범주를 사용하여 데이터를 분류합니다.
  • 개별 사용자(로밍): 이 범주는 특정 사용자와 관련된 응용 프로그램 데이터를 말하며 사용자가 도메인 내의 어떤 컴퓨터를 사용하든지 데이터를 사용할 수 있어야 합니다(예: 사용자 지정 사전). 이 설정은 도메인 환경에서 실행하도록 디자인되지 않은 응용 프로그램에는 적용되지 않습니다.
  • 개별 사용자(비 로밍): 이 범주는 특정 사용자와 관련된 응용 프로그램 데이터를 말하지만 단일 컴퓨터에서만 데이터를 사용할 수 있습니다(예: 사용자 지정 모니터 해상도).
  • 개별 컴퓨터(비 로밍, 비 사용자 관련): 이 범주는 특정 컴퓨터의 모든 사용자에게 적용되는 응용 프로그램 데이터를 말합니다(예: 응용 프로그램 사전, 로그 파일 또는 임시 파일).

응용 프로그램 데이터를 올바른 위치에 저장

SHGetFolderPath 함수를 사용하여 올바른 Application Data 폴더를 검색합니다. 이 폴더에 직접 응용 프로그램 데이터를 저장하지 마십시오. 대신 PathAppend 함수를 사용하여 SHGetFolderPath가 반환하는 경로에 하위 폴더를 추가하십시오. 반드시 다음 형식을 사용하십시오.
Company Name\Product Name\Product Version
예를 들어, 전체 경로에 대한 결과는 다음과 같이 나타날 수 있습니다.
\Documents and Settings\All Users\Application Data\My Company\My Product\1.0
올바른 Application Data 폴더를 찾으려면 응용 프로그램 데이터의 범주에 기반하여 적절한 CSIDL 값을 전달합니다.
  • 개별 사용자(로밍) 데이터의 경우 CSIDL_APPDATA 값을 사용합니다. 기본값은 다음 경로입니다.
    \Documents and Settings\< User Name >\Application Data
  • 개별 사용자(비 로밍) 데이터의 경우 CSIDL_LOCAL_APPDATA 값을 사용합니다. 기본값은 다음 경로입니다.
    \Documents and Settings\< User Name >\Local Settings\Application Data
  • 개별 컴퓨터(비 로밍, 비 사용자 관련) 데이터의 경우 CSIDL_COMMON_APPDATA 값을 사용합니다. 기본값은 다음 경로입니다.
    \Documents and Settings\All Users\Application Data
다음 코드는 CSIDL_COMMON_APPDATA 아래에 있는 임시 로그 파일을 여는 방법을 보여줍니다.
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.
      PathAppend( szPath, "\\My Company\\My Product\\1.0\\" );
      // Generate a temporary file name within this folder.
      if (GetTempFileName( szPath, 
                           "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 );
         }
      }
   }
}

신중한 레지스트리 사용 방법

경고: 레지스트리 편집기를 잘못 사용하면 심각한 문제가 발생할 수 있으며 문제를 해결하기 위해 운영 체제를 다시 설치해야 할 수도 있습니다. Microsoft는 레지스트리 편집기를 잘못 사용하여 발생하는 문제에 대한 해결을 보증하지 않습니다. 레지스트리 편집기의 사용에 따른 모든 책임은 사용자에게 있습니다.

레지스트리를 편집하는 방법에 대한 자세한 내용은 레지스트리 편집기(Regedit.exe)의 "키 및 값 변경" 도움말 항목 또는 Regedt32.exe의 "레지스트리의 정보 추가 및 삭제" 및 "레지스트리 데이터 편집" 도움말 항목을 참조하십시오. 레지스트리를 편집하기 전에 먼저 백업해야 합니다. 또한 Windows NT 또는 Windows 2000을 실행하는 경우 ERD(응급 복구 디스크)를 업데이트해야 합니다.

또한 레지스트리를 사용하여 크기가 작은 응용 프로그램 데이터를 저장할 수 있습니다. 64KB를 초과하는 데이터의 경우 Application Data 폴더를 사용해야 합니다. 레지스트리를 사용하여 응용 프로그램 데이터를 저장할 때 다음 가이드를 준수하십시오.
  • 크기가 작은 사용자 데이터의 경우 HKEY_CURRENT_USER(HKCU) 레지스트리 키를 사용하십시오.
  • 크기가 작은 컴퓨터 데이터인 경우 HKEY_LOCAL_MACHINE(HKLM) 레지스트리 키를 사용하십시오. 기본적으로 관리자가 아닌 사용자는 HKLM 트리에 읽기 전용 액세스 권한만 갖고 있으므로 런타임에 응용 프로그램은 HKLM에 기록할 수 없습니다.
  • 설치할 때 응용 프로그램은 HKCUHKLM에 총 128KB 이상 저장해서는 안됩니다.
  • 구성 요소 개체 모델(COM) 구성 요소는 HKEY_CLASSES_ROOT(HKCR) 레지스트리 키 아래 등록됩니다. 최대 128KB에는 HKCR이 포함되지 않습니다.
  • HKLM 또는 HKCU에 기록할 때 다음과 같이 회사 이름, 제품 이름 및 제품 버전 번호에 대한 키를 만들어야 합니다.
    HKLM\Software\Company Name\Product Name\Product Version
    HKCU\Software\Company Name\Product Name\Product Version
  • 레지스트리 함수(RegCreateKeyEx, RegSetValueEx 등)를 사용하여 레지스트리 항목을 읽고 씁니다.

문제 해결

  • 응용 프로그램이 Windows XP와 그 이전 버전의 Windows에서 실행되도록 하려면 항상 Shfolder.dll에 있는 SHGetFolderPath 구현에 연결해야 합니다. Windows XP는 Shell32.dll에 SHGetFolderPath를 포함하고 있지만 이전 버전 Windows는 이 동적 연결 라이브러리(DLL) 내에서 함수를 지원하지 않을 수 있습니다.
  • Shfolder.dll은 재분배 가능한 구성 요소이며 응용 프로그램과 함께 배포할 수 있습니다.
  • 내 문서 폴더나 다른 시스템 폴더에 대한 정식 경로를 최근 사용한 파일 목록과 같은 응용 프로그램 관련 위치에 저장하지 마십시오. 사용자나 관리자가 해당 응용 프로그램을 연속적으로 사용하면서 이들 폴더의 위치를 변경할 수도 있기 때문입니다.

참조

SHGetFolderPath가 식별할 수 있는 폴더의 집합에 대한 자세한 내용은 다음 Microsoft Platform SDK(소프트웨어 개발 키트) 설명서를 참조하십시오.
CSIDL 값
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/Functions/csidl.asp
셸 프로그래밍에 대한 자세한 내용은 MSDN 웹 사이트를 참조하십시오.
셸 프로그래머 가이드
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/shell_intro.asp
Visual C++ .NET에 대한 자세한 내용은 다음 Usenet 뉴스 그룹을 참조하십시오.
Microsoft.public.dotnet.languages.vc
다음 Visual C++ .NET 지원 센터를 방문하십시오.
Visual C++ .NET(2002) 지원 센터

속성

기술 자료: 310294 - 마지막 검토: 2002년 4월 17일 수요일 - 수정: 1.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C++ .NET 2002 Standard Edition?을(를) 다음과 함께 사용했을 때
    • Microsoft Windows XP Professional
키워드:?
kbhowtomaster kbnewsgrouplink KB310294

피드백 보내기

 

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