윈도우 앱개발을 향하여

블로그 이미지
윈도우 10 스토어에 앱을 개발해 올리는 것을 목표로 하고 있습니다. 비전공자가 독학으로 시도하는 일이어서 얼마나 걸릴지 모르겠지만... 아무튼 목표는 그렇습니다!!
by 코딩하는 경제학도
  • Total hit
  • Today hit
  • Yesterday hit

Getting a Folder's ID  (MSDN 번역)


Namespace object를 사용하기에 앞서 PIDL(pointer to an item identifier list) 또는 (file system object인 경우만) path(경로)를 얻어 object들을 구별할 수 있어야 한다. 여기서는 object ID들을 얻는 두가지 간단한 방법을 소개한다.


모든 폴더에 대해 적용되는 강력한 접근방법은 IShellFolder interface를 이용하는 것이다(Getting Information About the Contents of a Folder 참조 - 다음 챕터에 소개).


목차

The OpenFiles Dialog Box

The SHBrowseForFolder Dialog Box

Special Folders and CSIDLs

A Simple Example of How to Use CSIDLs and SHBrowseForFolder



- The OpenFiles Dialog Box


사용자가 namespace를 탐색하고 폴더를 선택할 수 있도록 하기 위해서는 당신의 application이 IFileDialog interface를 사용해야 한다. 이 인터페이스를 FOS_PICKFOLDERS flag와 함께 호출하면 the Open Files common dialog box가 "pick folders" mode로 실행된다. (WIndow Vista이후 폴더 선택방식으로 권장되는 방법)



- The SHBrowseForFolder Dialog Box


사용자가 namespace를 탐색하고 폴더를 선택할 수 있도록 하기 위해서는 당신의 application이 단순히 SHBrowseForFolder를 호출하여 Open or Save As common dialog boxes방식으로 작동하는 UI를 가진 dialog box를 실행시키면 됩니다.


사용자가 폴더를 선택하면 SHBrowseForFolder는 폴더의 fully qualified PIDL을 반환하고 그것의 이름을 표시합니다. 만약 그 폴더가 파일 시스템에 포함되는 것이라면 application은 SHGetPathFromIDList함수를 호출하여 PIDL을 경로로 변환할 수 있습니다. Application은 특정 root folder만 선택적으로 보임으로써 사용자의 폴더 선택을 제한할 수 있습니다.

(SHBrowseForFolder Function 참조)



- Special Folders and CSIDLs


사용되는 폴더들 중 상당수는 시스템에 의해 특별히 설계된 것이다. 이 특수 목적 폴더들은 거의 모든 시스템에 포함되어 있거나 설령 없더라도 그 폴더의 이름과 위치가 정의되어 있어 언제든 추가될 수 있다. 이 특수 폴더들은 모든 시스템의 표준 가상 폴더들(standard virtual folders; Printer, My Documents, Network Neighborhood 등)이거나 표준 파일 시스템 폴더들(standard file system folders; Program files, System 등) 이다.


모든 시스템에 포함되어 있기는 하지만 시스템 상황에 따라 그 폴더의 위치는 다를 수 있다(For example, the System directory is C:\Winnt\System32 on some systems and C:\Windows\System32 on others.). 이런 차이가 있는 환경변수를 피하기 위해 쉘은  CSIDLs라는 특수 폴더를 구별하는 방법을 제공한다.


CSIDLs는 특수 폴더의 위치를 이름이나 위치, 시스템과 관계없이 분별하는 공통의 방법을 제공한다. 환경변수와 달리 CSIDLs는 파일 시스템 폴더뿐 아니라 가상 폴더들에도 적용된다. 각 특수 폴더들은 고유의 CSIDL을 배정받는다. (For example, the Program Files file system folder has a CSIDL of CSIDL_PROGRAM_FILES, and the Network Neighborhood virtual folder has a CSIDL of CSIDL_NETWORK)


CSIDL은 몇몇 Shell function들과 함께 특수 폴더의 PIDL 또는 special file system folder의 경로를 얻어내는데 쓰인다. 만약 해당 폴더가 시스템에 존재하지 않는다면 CSIDL_FLAG_CREATE flag를 추가하여 해당 폴더를 만들 수도 있다. 

SHGetFolderLocation함수는 특수 폴더의 PIDL를 구하고, SHGetFolderPath함수는 파일시스템의 특수 폴더 경로를 구한다.

(SHGetSpecialFolderLocation/Path함수들은 Shell 5.0 버전 이후 위 두 함수의 래퍼함수에 불과하게 되었다. 대체되는 중)


- A Simple Example of How to Use CSIDLs and SHBrowseForFolder


LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL, LPSTR pszDisplayName)

{

    LPITEMIDLIST pidlRoot = NULL;

    LPITEMIDLIST pidlSelected = NULL;

    BROWSEINFO bi = {0};


    if(nCSIDL)

    {

        SHGetFolderLocation(hwnd, nCSIDL, NULL, NULL, &pidlRoot);

    }


    else

    {

        pidlRoot = NULL;

    }


    bi.hwndOwner = hwnd;

    bi.pidlRoot = pidlRoot;

    bi.pszDisplayName = pszDisplayName;

    bi.lpszTitle = "Choose a folder";

    bi.ulFlags = 0;

    bi.lpfn = NULL;

    bi.lParam = 0;


    pidlSelected = SHBrowseForFolder(&bi);


    if(pidlRoot)

    {

        CoTaskMemFree(pidlRoot);

    }


    return pidlSelected;

}


위 함수를 호출한 application은 SHBrowseForFolder함수가 필요로 하는 윈도우 핸들과 목표로 하는 특수 폴더의 CSIDL을 넘겨 검색할 root folder로 지정한다(그 목적은 검색 제한). 또한 pszDisplayName으로 문자열 버퍼를 넘겨 PidlBrowse가 반환될 때 선택된 폴더의 이름을 저장한다. 마지막에는 CoTaskMemFree함수로 사용한 IDList의 메모리를 해제해준다.




Getting a Folder's ID  (MSDN 번역)

AND

ARTICLE CATEGORY

분류 전체보기 (56)
Programming (45)
MSDN (4)
개발노트 (2)
reference (5)

RECENT ARTICLE

RECENT COMMENT

CALENDAR

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

ARCHIVE