Monikers de elementos
Otra clase de moniker implementada por OLE es el moniker de elemento, que se puede usar para identificar un objeto contenido en otro objeto. Un tipo de objeto contenido es un objeto OLE incrustado en un documento compuesto. Un documento compuesto podría identificar los objetos incrustados que contiene asignando cada uno un nombre arbitrario, como "embedobj1", "embedobj2", etc. Otro tipo de objeto contenido es una selección de usuario en un documento, como un intervalo de celdas de una hoja de cálculo o un intervalo de caracteres en un documento de texto. Un objeto que consta de una selección se denomina pseudoobjeto porque no se trata como un objeto distinto hasta que un usuario marca la selección. Una hoja de cálculo podría identificar un intervalo de celdas con un nombre como "1A:7F", mientras que un documento de procesamiento de texto podría identificar un intervalo de caracteres mediante el nombre de un marcador.
Un moniker de elemento es útil principalmente cuando se concatena o se compone, con otro moniker, uno que identifica el contenedor. Normalmente, se crea un moniker de elemento y, a continuación, se compone en (por ejemplo) un moniker de archivo para crear el equivalente de una ruta de acceso completa al objeto. Por ejemplo, puede componer el moniker de archivo "c:\work\report.doc" (que identifica el objeto contenedor) con el moniker de elementos "embedobj1" (que identifica un objeto dentro del contenedor) para formar el moniker "c:\work\report.doc\embedobj1", que identifica de forma única un objeto determinado dentro de un archivo determinado. También puede concatenar monikers de elementos adicionales para identificar objetos profundamente anidados. Por ejemplo, si "embedobj1" es el nombre de un objeto de hoja de cálculo, para identificar un determinado intervalo de celdas en ese objeto de hoja de cálculo, podría anexar otro moniker de elemento para crear un moniker que sería el equivalente de "c:\work\report.doc\embedobj1\1A:7F".
Cuando se combina con un moniker de archivo, un moniker de elemento forma una ruta de acceso completa. Los monikers de elementos amplían así la noción de nombres de ruta de acceso más allá del sistema de archivos, definiendo nombres de ruta de acceso para identificar objetos individuales, no solo archivos.
Hay una diferencia significativa entre un moniker de elemento y un moniker de archivo. La ruta de acceso contenida en un moniker de archivos es significativa para cualquier persona que comprenda el sistema de archivos, mientras que la ruta de acceso parcial contenida en un moniker de elemento solo es significativa para un contenedor determinado. Todos saben a qué se refiere "c:\work\report.doc", pero solo un objeto contenedor determinado sabe a qué se refiere "1A:7F". Un contenedor no puede interpretar un moniker de elementos creado por otra aplicación; el único contenedor al que conoce qué objeto hace referencia un moniker de elemento es el contenedor que asignó el moniker de elemento al objeto en primer lugar. Por este motivo, el origen del objeto denominado por la combinación de un moniker de archivo y elemento no solo debe implementar IPersistFile, para facilitar el enlace del moniker del archivo, sino también IOleItemContainer para facilitar la resolución del nombre del moniker de elemento en el objeto adecuado, en el contexto de un archivo.
La ventaja de monikers es que alguien que usa un moniker para localizar un objeto no necesita comprender el nombre contenido en el moniker del elemento, siempre y cuando el moniker del elemento forme parte de una composición. Por lo general, no tendría sentido que un moniker de elemento exista por sí mismo. En su lugar, crearía un moniker de elemento en un moniker de archivo. A continuación, llamaría a IMoniker::BindToObject en la composición, que enlaza los monikers individuales dentro de él, interpretando los nombres.
Para crear un objeto de moniker de elemento y devolver su puntero al proveedor de moniker, OLE proporciona la función auxiliar CreateItemMoniker. Esta función crea un objeto de moniker de elemento y devuelve su puntero al proveedor.
Temas relacionados