Introducción al espacio de nombres de Shell

El espacio de nombres shell organiza el sistema de archivos y otros objetos administrados por el Shell en una única jerarquía estructurada en árbol. Conceptualmente, es una versión más grande y inclusiva del sistema de archivos.

Introducción

Una de las principales responsabilidades del Shell es administrar y proporcionar acceso a la amplia variedad de objetos que componen el sistema. Los más numerosos y conocidos de estos objetos son las carpetas y archivos que residen en las unidades de disco del equipo. Sin embargo, el Shell también administra una serie de objetos virtuales o del sistema no de archivos. Estos son algunos ejemplos:

  • Impresoras de red
  • Otros equipos en red
  • aplicaciones de Panel de control
  • La Papelera de reciclaje

Algunos objetos virtuales no implican almacenamiento físico en absoluto. El objeto printer, por ejemplo, contiene una colección de vínculos a impresoras en red. Otros objetos virtuales, como la Papelera de reciclaje, pueden contener datos almacenados en una unidad de disco, pero deben controlarse de forma diferente a los archivos normales. Por ejemplo, se puede usar un objeto virtual para representar los datos almacenados en una base de datos. En términos del espacio de nombres, los distintos elementos de la base de datos podrían aparecer en el Explorador de Windows como objetos independientes, aunque todos se almacenen en un único archivo de disco.

Los objetos virtuales pueden incluso estar ubicados en equipos remotos. Por ejemplo, para facilitar la itinerancia, es posible que los archivos de documento de un usuario se almacenen en un servidor. Para proporcionar a los usuarios acceso a sus archivos desde varios equipos de escritorio, la carpeta Mis documentos en el equipo de escritorio que están usando actualmente apuntará al servidor, no al disco duro del equipo de escritorio. Su ruta de acceso incluirá una unidad de red asignada o un nombre de ruta de acceso UNC.

Al igual que el sistema de archivos, el espacio de nombres incluye dos tipos básicos de objeto: carpetas y archivos. Los objetos Folder son los nodos del árbol; son contenedores para objetos de archivo y otras carpetas. Los objetos file son las hojas del árbol; son archivos de disco normales o objetos virtuales, como vínculos de impresora. Las carpetas que no forman parte del sistema de archivos a veces se conocen como carpetas virtuales.

Al igual que las carpetas del sistema de archivos, la colección de carpetas virtuales suele variar de sistema a sistema. Hay tres clases de carpetas virtuales:

  • Carpetas virtuales estándar, como la Papelera de reciclaje, que se encuentran en todos los sistemas.
  • Carpetas virtuales opcionales que tienen nombres y funcionalidades estándar, pero que pueden no estar presentes en todos los sistemas.
  • Carpetas no estándar instaladas por el usuario.

A diferencia de las carpetas del sistema de archivos, los usuarios no pueden crear nuevas carpetas virtuales. Solo pueden instalar los creados por desarrolladores que no son de Microsoft. Por lo tanto, el número de carpetas virtuales suele ser mucho menor que el número de carpetas del sistema de archivos. Para obtener información sobre cómo implementar carpetas virtuales, consulte Extensiones de espacio de nombres.

Puede ver una representación visual de cómo se estructura el espacio de nombres en la barra del Explorador de Windows. Por ejemplo, la siguiente captura de pantalla del Explorador de Windows muestra un espacio de nombres relativamente sencillo.

una vista del espacio de nombres del shell

La raíz final de la jerarquía de espacios de nombres es el escritorio. Inmediatamente debajo de la raíz hay varias carpetas virtuales, como Mi computadora y la Papelera de reciclaje.

Los sistemas de archivos de las distintas unidades de disco se pueden ver como subconjuntos de la jerarquía de espacios de nombres más grande. Las raíces de estos sistemas de archivos son subcarpetas de la carpeta Mi pc. Mi computadora también incluye las raíces de las unidades de red asignadas. Otros nodos del árbol, como Mis documentos, son carpetas virtuales.

Identificación de objetos de espacio de nombres

Para poder usar un objeto de espacio de nombres, primero debe tener una manera de identificarlo. Un objeto del sistema de archivos podría tener un nombre como MyFile.htm. Dado que puede haber otros archivos con ese nombre en otro lugar del sistema, identificar de forma única un archivo o carpeta requiere una ruta de acceso completa, como "C:\MyDocs\MyFile.htm". Esta ruta de acceso es básicamente una lista ordenada de todas las carpetas de una ruta de acceso desde la raíz del sistema de archivos, C:\, que termina con el archivo.

En el contexto del espacio de nombres, las rutas de acceso siguen siendo bastante útiles para identificar objetos ubicados en la parte del sistema de archivos del espacio de nombres. Sin embargo, no se pueden usar para objetos virtuales. En su lugar, shell proporciona un medio alternativo de identificación que se puede usar con cualquier objeto de espacio de nombres.

Identificadores de elemento

Dentro de una carpeta, cada objeto tiene un identificador de elemento, que es el equivalente funcional de un nombre de archivo o carpeta. El identificador de elemento es realmente una estructura SHITEMID :

typedef struct _SHITEMID { 
    USHORT cb; 
    BYTE   abID[1]; 
} SHITEMID, * LPSHITEMID; 

El miembro abID es el identificador del objeto. La longitud de abID no está definida y su valor viene determinado por la carpeta que contiene el objeto . Dado que no hay ninguna definición estándar sobre cómo se asignan los valores abID por carpetas, solo son significativos para el objeto de carpeta asociado. Las aplicaciones simplemente deben tratarlas como un token que identifica un objeto en una carpeta determinada. Dado que la longitud de abID varía, el miembro cb contiene el tamaño de la estructura SHITEMID , en bytes.

Dado que los identificadores de elemento no son útiles para fines de presentación, la carpeta que contiene el objeto normalmente le asigna un nombre para mostrar. Este es el nombre que usa el Explorador de Windows cuando muestra el contenido de una carpeta. Para obtener más información sobre cómo se controlan los nombres para mostrar, vea Obtener información de una carpeta.

Listas de identificadores de elemento

El identificador de elemento rara vez se usa por sí mismo. Normalmente, forma parte de una lista de identificadores de elemento, que sirve para el mismo propósito que una ruta de acceso del sistema de archivos. Sin embargo, en lugar de la cadena de caracteres usada para las rutas de acceso, una lista de identificadores de elemento es una estructura ITEMIDLIST . Esta estructura es una secuencia ordenada de uno o varios identificadores de elemento, terminados por un valor NULL de dos bytes. Cada identificador de elemento de la lista de identificadores de elemento corresponde a un objeto de espacio de nombres. Su orden define una ruta de acceso en el espacio de nombres, de forma muy similar a una ruta de acceso del sistema de archivos.

En la ilustración siguiente se muestra una representación esquemática de la estructura ITEMIDLIST que corresponde a C:\MyDocs\MyFile.htm. El nombre para mostrar de cada identificador de elemento se muestra encima. Los distintos anchos de los miembros abID son arbitrarios; ilustran el hecho de que el tamaño de este miembro puede variar.

una ilustración esquemamática de un pidl

PIDLs

Para la API de Shell, los objetos de espacio de nombres normalmente se identifican mediante un puntero a su estructura ITEMIDLIST o un puntero a una lista de identificadores de elemento (PIDL). Por comodidad, el término PIDL generalmente hará referencia en esta documentación a la propia estructura en lugar del puntero a ella.

El PIDL que se muestra en la ilustración anterior se conoce como PIDL completo o absoluto. Un PIDL completo se inicia desde el escritorio y contiene los identificadores de elemento de todas las carpetas intermedias de la ruta de acceso. Termina con el identificador de elemento del objeto seguido de un valor NULL de dos bytes de terminación. Un PIDL completo es similar a una ruta de acceso completa e identifica de forma única el objeto en el espacio de nombres de Shell.

Los PIDL completos se usan con poca frecuencia. Muchas funciones y métodos esperan un PIDL relativo. La raíz de un PIDL relativo es una carpeta, no el escritorio. Al igual que con las rutas de acceso relativas, la serie de identificadores de elemento que componen la estructura define una ruta de acceso en el espacio de nombres entre dos objetos. Aunque no identifican de forma única el objeto, suelen ser más pequeños que un PIDL completo y suficientes para muchos fines.

Los PIDL relativos más usados, los PIDL de nivel único, son relativos a la carpeta primaria del objeto. Solo contienen el identificador de elemento del objeto y un valor NULL de terminación. Los PIDL de varios niveles también se usan con muchos fines. Contienen dos o más identificadores de elemento y normalmente definen una ruta de acceso de una carpeta primaria a un objeto a través de una serie de una o varias subcarpetas. Tenga en cuenta que un PIDL de nivel único todavía puede ser un PIDL completo. En concreto, los objetos de escritorio son elementos secundarios del escritorio, por lo que sus PIN completos contienen solo un identificador de elemento.

Como se describe en Obtención del identificador de una carpeta, la API de Shell proporciona varias maneras de recuperar el PIDL de un objeto. Una vez que lo tenga, normalmente simplemente se usa para identificar el objeto cuando se llama a otras funciones y métodos de la API de Shell. En este contexto, el contenido interno de un PIDL es opaco e irrelevante. Para este análisis, piense en los PIDL como tokens que representan objetos de espacio de nombres concretos y céntrelos en cómo usarlos para tareas comunes.

Asignación de PIN

Aunque los PIDL tienen cierta similitud con las rutas de acceso, su uso requiere un enfoque algo diferente. La principal diferencia es cómo asignar y desasignar memoria para ellos.

Al igual que la cadena usada para una ruta de acceso, la memoria debe asignarse para un PIDL. Si una aplicación crea un PIDL, debe asignar suficiente memoria para la estructura ITEMIDLIST . Para la mayoría de los casos descritos aquí, el Shell crea el PIDL y controla la asignación de memoria. Independientemente de lo que asignó el PIDL, la aplicación suele ser responsable de desasignar el PIDL cuando ya no es necesario.

Use la función CoTaskMemAlloc para asignar el PIDL y la función CoTaskMemFree para desasignarlo.