셸 네임스페이스 소개
셸 네임스페이스는 셸에서 관리하는 파일 시스템 및 기타 개체를 단일 트리 구조 계층 구조로 구성합니다. 개념적으로 파일 시스템의 더 크고 포괄적인 버전입니다.
소개
Shell의 주요 책임 중 하나는 시스템을 구성하는 다양한 개체에 대한 액세스를 관리하고 제공하는 것입니다. 이러한 개체 중 가장 많고 익숙한 것은 컴퓨터 디스크 드라이브에 있는 폴더와 파일입니다. 그러나 Shell은 다수의 비파일 시스템 또는 가상 개체도 관리합니다. 일부 사례:
- 네트워크 프린터
- 기타 네트워크 컴퓨터
- 제어판 애플리케이션
- 휴지통
일부 가상 개체에는 실제 스토리지가 전혀 포함되지 않습니다. instance 프린터 개체에는 네트워크 프린터에 대한 링크 컬렉션이 포함되어 있습니다. 휴지통과 같은 다른 가상 개체에는 디스크 드라이브에 저장된 데이터가 포함될 수 있지만 일반 파일과 다르게 처리해야 합니다. 예를 들어 가상 개체를 사용하여 데이터베이스에 저장된 데이터를 나타낼 수 있습니다. 네임스페이스의 관점에서 데이터베이스의 다양한 항목은 모두 단일 디스크 파일에 저장되어 있더라도 Windows Explorer 별도의 개체로 나타날 수 있습니다.
가상 개체는 원격 컴퓨터에도 있을 수 있습니다. instance 경우 로밍을 용이하게 하기 위해 사용자의 문서 파일이 서버에 저장될 수 있습니다. 사용자가 여러 데스크톱 PC에서 파일에 액세스할 수 있도록 현재 사용 중인 데스크톱 PC의 내 문서 폴더는 데스크톱 PC의 하드 디스크가 아닌 서버를 가리킵니다. 해당 경로에는 매핑된 네트워크 드라이브 또는 UNC 경로 이름이 포함됩니다.
파일 시스템과 마찬가지로 네임스페이스에는 폴더와 파일이라는 두 가지 기본 유형의 개체가 포함됩니다. 폴더 개체는 트리의 노드 입니다. 파일 개체 및 기타 폴더에 대한 컨테이너입니다. 파일 개체는 트리의 잎 입니다. 일반 디스크 파일 또는 프린터 링크와 같은 가상 개체입니다. 파일 시스템의 일부가 아닌 폴더를 가상 폴더라고도 합니다.
파일 시스템 폴더와 마찬가지로 가상 폴더의 컬렉션은 일반적으로 시스템마다 다릅니다. 가상 폴더에는 세 가지 클래스가 있습니다.
- 모든 시스템에서 찾을 수 있는 표준 가상 폴더(예: 휴지통)입니다.
- 표준 이름 및 기능이 있지만 모든 시스템에는 없을 수 있는 선택적 가상 폴더입니다.
- 사용자가 설치한 비표준 폴더입니다.
파일 시스템 폴더와 달리 사용자는 새 가상 폴더를 직접 만들 수 없습니다. Microsoft가 아닌 개발자가 만든 항목만 설치할 수 있습니다. 따라서 가상 폴더 수는 일반적으로 파일 시스템 폴더 수보다 훨씬 적습니다. 가상 폴더를 구현하는 방법에 대한 자세한 내용은 네임스페이스 확장을 참조하세요.
Windows Explorer Explorer 표시줄에서 네임스페이스가 어떻게 구성되는지 시각적으로 볼 수 있습니다. 예를 들어 Windows Explorer 다음 스크린샷에는 비교적 간단한 네임스페이스가 표시됩니다.
네임스페이스 계층 구조의 궁극적인 루트는 데스크톱입니다. 루트 바로 아래에는 내 컴퓨터 및 휴지통과 같은 여러 가상 폴더가 있습니다.
다양한 디스크 드라이브의 파일 시스템은 더 큰 네임스페이스 계층 구조의 하위 집합으로 볼 수 있습니다. 이러한 파일 시스템의 루트는 내 컴퓨터 폴더의 하위 폴더입니다. 내 컴퓨터에는 매핑된 네트워크 드라이브의 루트도 포함됩니다. 트리의 다른 노드(예: 내 문서)는 가상 폴더입니다.
네임스페이스 개체 식별
네임스페이스 개체를 사용하려면 먼저 네임스페이스 개체를 식별하는 방법이 있어야 합니다. 파일 시스템의 개체에는 MyFile.htm 같은 이름이 있을 수 있습니다. 시스템의 다른 위치에 해당 이름의 다른 파일이 있을 수 있으므로 파일 또는 폴더를 고유하게 식별하려면 "C:\MyDocs\MyFile.htm"과 같은 정규화된 경로가 필요합니다. 이 경로는 기본적으로 파일 시스템 루트 C:\에서 파일로 끝나는 경로에 있는 모든 폴더의 순서가 지정된 목록입니다.
네임스페이스의 컨텍스트에서 경로는 여전히 네임스페이스의 파일 시스템 부분에 있는 개체를 식별하는 데 매우 유용합니다. 그러나 가상 개체에는 사용할 수 없습니다. 대신 Shell은 모든 네임스페이스 개체와 함께 사용할 수 있는 대체 식별 수단을 제공합니다.
항목 ID
폴더 내에서 각 개체에는 파일 또는 폴더 이름에 해당하는 항목 ID가 있습니다. 항목 ID는 실제로 SHITEMID 구조입니다.
typedef struct _SHITEMID {
USHORT cb;
BYTE abID[1];
} SHITEMID, * LPSHITEMID;
abID 멤버는 개체의 식별자입니다. abID의 길이가 정의되지 않았으며 해당 값은 개체가 포함된 폴더에 의해 결정됩니다. 폴더에서 abID 값을 할당하는 방법에 대한 표준 정의는 없으므로 연결된 폴더 개체에만 의미가 있습니다. 애플리케이션은 단순히 특정 폴더의 개체를 식별하는 토큰으로 처리해야 합니다. abID의 길이가 다르기 때문에 cb 멤버는 SHITEMID 구조체의 크기를 바이트 단위로 보유합니다.
항목 ID는 표시 목적으로 유용하지 않으므로 개체가 포함된 폴더는 일반적으로 표시 이름을 할당합니다. 폴더의 내용을 표시할 때 Windows Explorer 사용하는 이름입니다. 표시 이름을 처리하는 방법에 대한 자세한 내용은 폴더에서 정보 가져오기를 참조하세요.
항목 ID 목록
항목 ID는 자체에서 거의 사용되지 않습니다. 일반적으로 파일 시스템 경로와 동일한 용도로 사용되는 항목 ID 목록의 일부입니다. 그러나 경로에 사용되는 문자열 대신 항목 ID 목록은 ITEMIDLIST 구조입니다. 이 구조체는 2 바이트 NULL로 종료되는 하나 이상의 항목 ID의 순서가 지정된 시퀀스입니다. 항목 ID 목록의 각 항목 ID는 네임스페이스 개체에 해당합니다. 해당 순서는 파일 시스템 경로와 마찬가지로 네임스페이스의 경로를 정의합니다.
다음 그림에서는 C:\MyDocs\MyFile.htm 해당하는 ITEMIDLIST 구조체의 도식 표현을 보여 줍니다. 각 항목 ID의 표시 이름이 위에 표시됩니다. abID 멤버의 다양한 너비는 임의입니다. 멤버의 크기가 다를 수 있다는 사실을 보여 줍니다.
PIDL
Shell API의 경우 네임스페이스 개체는 일반적으로 ITEMIDLIST 구조에 대한 포인터 또는 PIDL(항목 식별자 목록)에 대한 포인터로 식별됩니다. 편의를 위해 PIDL이라는 용어는 일반적으로 이 설명서에서 포인터가 아닌 구조 자체를 참조합니다.
앞의 그림에 표시된 PIDL을 전체 또는 절대 PIDL이라고 합니다. 전체 PIDL은 데스크톱에서 시작하며 경로에 있는 모든 중간 폴더의 항목 ID를 포함합니다. 개체의 항목 ID와 종료되는 2 바이트 NULL로 끝납니다. 전체 PIDL은 정규화된 경로와 유사하며 셸 네임스페이스의 개체를 고유하게 식별합니다.
전체 PIDL은 자주 사용되지 않습니다. 많은 함수와 메서드에는 상대적인 PIDL이 예상됩니다. 상대 PIDL의 루트는 데스크톱이 아닌 폴더입니다. 상대 경로와 마찬가지로 구조를 구성하는 일련의 항목 ID는 두 개체 사이의 네임스페이스의 경로를 정의합니다. 개체를 고유하게 식별하지는 않지만 일반적으로 전체 PIDL보다 작고 많은 용도로 충분합니다.
가장 일반적으로 사용되는 상대 PIDL인 단일 수준 PIDL은 개체의 부모 폴더를 기준으로 합니다. 개체의 항목 ID와 종료 되는 NULL만 포함합니다. 다중 수준 PIDL도 여러 용도로 사용됩니다. 두 개 이상의 항목 ID를 포함하며 일반적으로 하나 이상의 하위 폴더를 통해 부모 폴더에서 개체로의 경로를 정의합니다. 단일 수준 PIDL은 여전히 정규화된 PIDL일 수 있습니다. 특히 데스크톱 개체는 데스크톱의 자식이므로 정규화된 PIDL에는 하나의 항목 ID만 포함됩니다.
폴더 ID 가져오기에서 설명한 대로 셸 API는 개체의 PIDL을 검색하는 다양한 방법을 제공합니다. 이 함수가 있으면 일반적으로 다른 Shell API 함수 및 메서드를 호출할 때 개체를 식별하는 데만 사용합니다. 이 컨텍스트에서 PIDL의 내부 콘텐츠는 불투명하고 관련이 없습니다. 이 설명에서는 PIDL을 특정 네임스페이스 개체를 나타내는 토큰으로 생각하고 일반적인 작업에 사용하는 방법에 집중합니다.
PIDL 할당
PIDL은 경로와 약간 유사하지만 이를 사용하려면 다소 다른 접근 방식이 필요합니다. 주요 차이점은 메모리를 할당하고 할당 취소하는 방법입니다.
경로에 사용되는 문자열과 마찬가지로 PIDL에 메모리를 할당해야 합니다. 애플리케이션이 PIDL을 만드는 경우 ITEMIDLIST 구조에 충분한 메모리를 할당해야 합니다. 여기서 설명하는 대부분의 경우 Shell은 PIDL을 만들고 메모리 할당을 처리합니다. PIDL을 할당한 내용에 관계없이 애플리케이션은 일반적으로 더 이상 필요하지 않을 때 PIDL의 할당을 취소해야 합니다.
CoTaskMemAlloc 함수를 사용하여 PIDL을 할당하고 CoTaskMemFree 함수를 사용하여 할당을 취소합니다.