PIDL 이란?

프로그래밍/C++ 2006. 11. 1. 07:42 |
헬마입니다.

  PIDL (Pointer to Item Identifier List) 윈도 쉘을 알기위해선 결코 지나칠 수 없는 이름이다. 그러면, pidl을 공부하

기 전에 윈도 쉘을 살펴보고 pidl 이란 것이 어떻게 생겨났는지 알아보자.

  윈도는 3.1에서 95로 버전업을 하면서 쉘을 파일중심에서 문서, 객체지향적인 관점에서 바라보는 것으로 이동하

였다. <이에 대한 가장 간단한 예는 exe 같은 실행파일이 아닌 txt 등의 파일을 탐색기에서 더블 클릭해도 뭔가 프

로그램이 실행된다는 것이다. 도스에서는 절대 있을 수 없는 일이다> 하지만, 파일을 벗어나 객체를 중심으로 쉘을
조직화하고 바탕화면 같은 새로운 객체들 <그러면서 시스템에 실제 파일이나 디렉토리로 존재하지 않는> 이 생겨

나면서 문제가 생겼다. 각 객체를 이전의 파일처럼 유일성을 보장하여 서로 구분할 새로운 방법이 필요해진 것이

다. < 파일은 예로 C:\test.txt 라는 경로명 + 파일이름으로 유일성을 보장할 수 있다. 동일한 경로에 동일한 파일

은 하나밖에 없다 > 파일시스템처럼 경로명을 사용하면 된다고 생각하겠지만 이 역시 난관이 많다. 탐색기를 열어

좌측의 폴더트리를 한번 보자. 실제로 디렉토리가 아님에도 나타나는 폴더들이 많다 < 당장 제일 상위 노드인 바탕

화면 부터 실제로 존재하지 않는다 > 이런 것들은 실제로 시스템에 존재하는 것이 아니라 가상으로 구현되어 쉘에

의해 관리되고 파일이나 디렉토리처럼 또 하나의 문서로 취급되는 것이다. 결국 윈도는 이러한 객체들과 이전의 파

    typedef struct _ITEMIDLIST
   {
       SHITEMID mkid;
   } ITEMIDLIST *LPITEMIDLIST;

음, 별로 도움이 되지 않는다. SHITEMID 라는 구조체를 다시 살펴보자.

    typedef struct _SHITEMID
    {
         UINT cbSize; // 구조체 크기, 자신 포함
         BYTE abID[1]; // 실제적인 데이터
    } SHITEMID

  이제 뭔가 조금 알 것 같다. 선언에는 데이터가 1바이트짜리 배열이지만 실제로 이렇게 1바이트만 덜렁 쓰는일은

없을것이다. 뭔가 알듯하지만 여전히 PIDL이 뭔지 감조차 오지 않는다. 그러면 더욱 쉽게 PIDL 과 디렉토리 경로명

의 구조를 비교하면서 감을 잡아보자.

  C : \ example \ test \ temp.ext

라는 파일이 있다고 하자 이는 세개의 경로명과 하나의 파일명으로 이루어져 있다. 이와 같은 것을 PIDL 로 구성하면 구조가 아래와 같이 나온다.



일, 디렉토리들을 통합하여 하나의 방법으로 완전히 구별할 수 있는 방법이 필요해졌고 이에 대한 해결책이 PIDL

이다. 윈도 쉘은 기본적으로 PIDL 로 파일, 폴더, 가상 폴더등의 객체를 인식하고 관리한다.


PIDL은 ITEMIDLIST 라는 구조체에 대한 포인터이다. 그러면 이 구조체를 살펴보자

  PIDL
   |
  cbSize   abID                cbSize    abID                  cbSize    abID               cbSize   abID
     4          C:                    9         example                 6         test                   10      temp.ext

같은 모습이 된다. PIDL은 이러한 연속적인 메모리 구성의 제일 처음을 가리키는 포인터이다. 따라서, 다음 구성요소를 구하려면 PIDL 에서 크기만큼 바이트 이동하면 된다. 현재 PIDL 은 C: 구성요소를 가리키고 있고 다음 구성요소인 example 을 얻고 싶다면 아래와 같이 바이트이동해서 얻으면 된다.
 
  LPITEMIDLIST((LPBYTE)pidl + 4)

  위와 같이 주소 연산을 하면 PIDL은 두번쨰 example을 가리키게 된다. 또한 이러한 연결은 cbSize 가 0 인 곳에

서 끝이 난다. 즉 연결의 마지막은 cbSize 가 0인가를 검사하면 된다. 이러한 PIDL 이란 구조를 이용하여 쉘은 모

든 파일, 폴더, 객체를 구분하고 있다. 앞으로는 이러한 PIDL 을 이용하는 예를 알아보자.

<Visual C++ Shell Programming > 참조.

댓글을 달아 주세요

  1. BlogIcon 금메달.아빠 2010.09.17 01:20 신고 Address Modify/Delete Reply

    좋은 정보 감사합니다. 잘 읽고 엮인글(트랙백)을 추가하였습니다.

    행복한 하루 되세요.