ITEMIDLIST는 System에서 중복되지 않는(유일한) 항목을 나타내기 위한 구조체입니다. PIDL이라고 불립니다. Windows Shell Programming에는 꼭 나오는 녀석이지요.
System에서 '유일하다'는 것은 어떤 것일까요. 이해를 돕기 위해 기존의 방식으로 '유일'하게 표시할 수 없는 예를 들어보죠. '내 문서(My Document)'라고 아시지요?
Windows 2000일 때, '내 문서'를 탐색기로부터 찾아들어가는 방법은 두 가지가 있습니다.
방법 1 : [바탕 화면] -> [내 컴퓨터] -> [Drive (C:)] -> [Documents and Settings]
-> [Administrator] -> [My Documents]
방법 2 : [바탕 화면] -> [내 문서]
[내 문서]는 실제 File System에도 존재하는 '디렉토리'기도 하지만, 바탕화면에 바로 존재하는 '폴더'이기도 합니다. 그러나 이 Item은 유일합니다.
또한, 우리는 보통 '디렉토리'와 '폴더' 라는 용어를 구분없이 쓰지만 사실 차이가 있습니다. 디렉토리는 File System의 구성요소로서 File을 담고 있는 공간입니다만, 폴더는 그냥 '뭔가 담고 있는 공간' 입니다. '뭔가'에 해당하는 것은 '아무 것'이 될 수 있습니다. [제어판]이나 [프린터] 같은 폴더가 그런 것이지요.
이러한 관계로 System에 존재하는 모든 Item을 File Path로만 구분할 수 없게 되었습니다. Item을 구분할 다른 기술이 필요했던 것이지요. Windows에서 그 역할을 해주는 것이 바로 PIDL 입니다.
ITEMIDLIST는 SHITEMID의 배열 입니다. 관계를 보면 다음과 같습니다.
typedef struct _ITEMIDLIST {
SHITEMID mkid;
} ITEMIDLIST;
typedef struct _SHITEMID {
USHORT cb;
BYTE abID[1];
} SHITEMID;
재미있는 것은, SHITEMID의 크기가 '가변'이라는 것입니다. cb에는 SHITEMID가 차지하는 총 크기 값이 들어가게 됩니다. adID[1]이라고 된 곳은 정말로 1 Byte만 저장되는 것이 아니라, 해당 Item을 식별하는데 필요한 정보가 다 들어가 있습니다. 이 정보의 크기는 Item 마다 다릅니다.
ITEMIDLIST에는 SHITEMID들이 '줄줄이' 들어가있습니다. 이름 자체도 ITEM-ID-LIST 아니겠습니까. ITEMIDLIST를 통해서 SHITEMID에 접근하기 위해서 주로 ITEMIDLIST의 Pointer를 사용하게 되기 때문에 이들 PIDL이라고 부릅니다.
System에 존재하는 모든 Item은 그에 대응되는 유일한 PIDL을 하나씩 가집니다. '내 문서'도 마찬가지죠.
그런데 잠깐 느끼셨을지 모르겠지만, PIDL을 다루는 것은 그렇게 편안하지 않습니다. 필요는 발명의 어머니이기 때문에, 많은 어머니들이 아들들을 위해 PIDL을 쉽게 다룰 수 있는 Class를 준비해두었습니다.
CodeProject에서 다음 항목을 찾아보세요.
http://www.codeproject.com/shell/pxshlapi.asp?target=ITEMIDLIST
http://www.codeproject.com/shell/citemidlist.asp?target=ITEMIDLIST
'탐색기'를 거의 바닥부터 만들어 본 적이 있었는데, 당시엔 이런 게 미리 존재하는 줄 모르고 PIDL Helper Class를 만들어썼습니다. (사실 별 것 없습니다. byte 단위로 이동하며 값 찾고 잘라내고 복사하는 노동만 있을 뿐이지요.) PIDL을 잘라내서 뭔가 한다던가 하는 게 아니라면 저런 PIDL Helper Class를 그냥 써도 될겁니다.
System에서 '유일하다'는 것은 어떤 것일까요. 이해를 돕기 위해 기존의 방식으로 '유일'하게 표시할 수 없는 예를 들어보죠. '내 문서(My Document)'라고 아시지요?
Windows 2000일 때, '내 문서'를 탐색기로부터 찾아들어가는 방법은 두 가지가 있습니다.
방법 1 : [바탕 화면] -> [내 컴퓨터] -> [Drive (C:)] -> [Documents and Settings]
-> [Administrator] -> [My Documents]
방법 2 : [바탕 화면] -> [내 문서]
[내 문서]는 실제 File System에도 존재하는 '디렉토리'기도 하지만, 바탕화면에 바로 존재하는 '폴더'이기도 합니다. 그러나 이 Item은 유일합니다.
또한, 우리는 보통 '디렉토리'와 '폴더' 라는 용어를 구분없이 쓰지만 사실 차이가 있습니다. 디렉토리는 File System의 구성요소로서 File을 담고 있는 공간입니다만, 폴더는 그냥 '뭔가 담고 있는 공간' 입니다. '뭔가'에 해당하는 것은 '아무 것'이 될 수 있습니다. [제어판]이나 [프린터] 같은 폴더가 그런 것이지요.
이러한 관계로 System에 존재하는 모든 Item을 File Path로만 구분할 수 없게 되었습니다. Item을 구분할 다른 기술이 필요했던 것이지요. Windows에서 그 역할을 해주는 것이 바로 PIDL 입니다.
ITEMIDLIST는 SHITEMID의 배열 입니다. 관계를 보면 다음과 같습니다.
typedef struct _ITEMIDLIST {
SHITEMID mkid;
} ITEMIDLIST;
typedef struct _SHITEMID {
USHORT cb;
BYTE abID[1];
} SHITEMID;
재미있는 것은, SHITEMID의 크기가 '가변'이라는 것입니다. cb에는 SHITEMID가 차지하는 총 크기 값이 들어가게 됩니다. adID[1]이라고 된 곳은 정말로 1 Byte만 저장되는 것이 아니라, 해당 Item을 식별하는데 필요한 정보가 다 들어가 있습니다. 이 정보의 크기는 Item 마다 다릅니다.
ITEMIDLIST에는 SHITEMID들이 '줄줄이' 들어가있습니다. 이름 자체도 ITEM-ID-LIST 아니겠습니까. ITEMIDLIST를 통해서 SHITEMID에 접근하기 위해서 주로 ITEMIDLIST의 Pointer를 사용하게 되기 때문에 이들 PIDL이라고 부릅니다.
System에 존재하는 모든 Item은 그에 대응되는 유일한 PIDL을 하나씩 가집니다. '내 문서'도 마찬가지죠.
그런데 잠깐 느끼셨을지 모르겠지만, PIDL을 다루는 것은 그렇게 편안하지 않습니다. 필요는 발명의 어머니이기 때문에, 많은 어머니들이 아들들을 위해 PIDL을 쉽게 다룰 수 있는 Class를 준비해두었습니다.
CodeProject에서 다음 항목을 찾아보세요.
http://www.codeproject.com/shell/pxshlapi.asp?target=ITEMIDLIST
http://www.codeproject.com/shell/citemidlist.asp?target=ITEMIDLIST
'탐색기'를 거의 바닥부터 만들어 본 적이 있었는데, 당시엔 이런 게 미리 존재하는 줄 모르고 PIDL Helper Class를 만들어썼습니다. (사실 별 것 없습니다. byte 단위로 이동하며 값 찾고 잘라내고 복사하는 노동만 있을 뿐이지요.) PIDL을 잘라내서 뭔가 한다던가 하는 게 아니라면 저런 PIDL Helper Class를 그냥 써도 될겁니다.




