Compartir a través de


Interfaz IMoniker (objidl.h)

Permite usar un objeto de moniker, que contiene información que identifica de forma única un objeto COM. Un objeto que tiene un puntero a la interfaz IMoniker del objeto de moniker puede localizar, activar y obtener acceso al objeto identificado sin tener ninguna otra información específica sobre dónde se encuentra realmente el objeto en un sistema distribuido.

Los monikers se usan como base para vincular en COM. Un objeto vinculado contiene un moniker que identifica su origen. Cuando el usuario activa el objeto vinculado para editarlo, se enlaza el moniker; esto carga el origen del vínculo en la memoria.

Herencia

La interfaz IMoniker hereda de IPersistStream. IMoniker también tiene estos tipos de miembros:

Métodos

La interfaz IMoniker tiene estos métodos.

 
IMoniker::BindToObject

Enlaza al objeto especificado. El proceso de enlace implica buscar el objeto, colocarlo en el estado en ejecución si es necesario y proporcionar al autor de la llamada un puntero a una interfaz especificada en el objeto identificado.
IMoniker::BindToStorage

Enlaza al almacenamiento del objeto especificado. A diferencia del método IMoniker::BindToObject, este método no activa el objeto identificado por el moniker.
IMoniker::CommonPrefixWith

Crea un nuevo moniker basado en el prefijo que este moniker tiene en común con el moniker especificado.
IMoniker::ComposeWith

Crea un nuevo moniker compuesto combinando el moniker actual con el moniker especificado.
IMoniker::Enum

Recupera un puntero a un enumerador para los componentes de un moniker compuesto.
IMoniker::GetDisplayName

Recupera el nombre para mostrar del moniker.
IMoniker::GetTimeOfLastChange

Recupera la hora en la que se cambió por última vez el objeto identificado por este moniker.
IMoniker::Hash

Crea un valor hash mediante el estado interno del moniker.
IMoniker::Inverse

Crea un moniker que es el inverso de este moniker. Cuando se compone a la derecha de este moniker o de una estructura similar, el moniker no se compone de nada.
IMoniker::IsEqual

Determina si este moniker es idéntico al moniker especificado.
IMoniker::IsRunning

Determina si el objeto identificado por este moniker está cargado y en ejecución actualmente.
IMoniker::IsSystemMoniker

Determina si este moniker es una de las clases de moniker proporcionadas por el sistema.
IMoniker::P arseDisplayName

Convierte un nombre para mostrar en un moniker.
IMoniker::Reduce

Reduce un moniker a su forma más sencilla.
IMoniker::RelativePathTo

Crea un moniker relativo entre este moniker y el moniker especificado.

Comentarios

Al igual que una ruta de acceso a un archivo de un sistema de archivos, un moniker contiene información que permite ubicar y activar un objeto COM. Monikers puede identificar cualquier tipo de objeto COM, desde un objeto de documento almacenado en un archivo a una selección dentro de un objeto incrustado. COM proporciona un conjunto de clases de moniker que permiten crear objetos de moniker que identifican los objetos que se encuentran con más frecuencia en el sistema. Por ejemplo, podría haber un objeto que representa un rango de celdas de una hoja de cálculo que se incrusta en un documento de texto almacenado en un archivo. En un sistema distribuido, el moniker de este objeto identificaría la ubicación del sistema del objeto, la ubicación física del archivo en ese sistema, el almacenamiento del objeto incrustado dentro de ese archivo y, por último, la ubicación del intervalo de celdas dentro del objeto incrustado.

Un objeto moniker admite la interfaz IMoniker , que se deriva de la interfaz IPersistStream e identifica de forma única un solo objeto en el sistema. Después de que un objeto que proporcione un moniker haya creado el objeto moniker, esta información no se puede cambiar dentro de ese objeto. Si el proveedor de moniker cambia la información, solo puede hacerlo mediante la creación de un nuevo objeto de moniker, que identificaría de forma única el objeto en cuestión.

Monikers tiene las dos funcionalidades importantes siguientes:

  • Los monikers se pueden guardar en un almacenamiento persistente. Cuando se vuelve a cargar un moniker en la memoria, sigue identificando el mismo objeto.
  • Monikers admite una operación denominada enlace, que es el proceso de buscar el objeto denominado por el moniker, activarlo (cargarlo en la memoria) si aún no está activo y devolver un puntero a una interfaz solicitada en ese objeto.

Implementación anti-moniker

Los anti-monikers son el inverso de las implementaciones COM de los monikers de archivo, elemento y puntero. Es decir, un anti-moniker compuesto a la derecha de un moniker de archivo, moniker de elemento o moniker de puntero se compone en nada.

Si es un cliente de moniker, normalmente no es necesario usar anti-monikers. Cuando necesites el inverso de un moniker, debes llamar a IMoniker::Inverse. Por ejemplo, si necesita un inverso para quitar la última pieza de un moniker compuesto, use IMoniker::Enum para enumerar las piezas del moniker y llamar a Inverso en la pieza más a la derecha. No debe usar un anti-moniker para este propósito porque no puede estar seguro de que la parte más adecuada de un compuesto considera que un anti-moniker es su inverso.

La única situación en la que debe usar explícitamente un anti-moniker es cuando está escribiendo una nueva clase de moniker y no tiene requisitos especiales para construir inversos a sus monikers. En esa situación, puede devolver anti-monikers desde la implementación de Inverse. En tu implementación de IMoniker::ComposeWith, entonces debes eliminar uno de tus monikers por cada anti-moniker que encuentres.

Use la función CreateAntiMoniker para crear estos monikers.

Implementación de moniker de clase

Los monikers de clase son monikers que representan una clase de objeto. Los monikers de clase enlazan al objeto de clase de la clase para la que se crean.

Los monikers de clase son más útiles en la composición con otros tipos de monikers, como monikers de archivo o monikers de elementos. Los monikers de clase también se pueden componer a la derecha de monikers que admiten el enlace a la interfaz IClassActivator . Esto permite que IClassActivator proporcione acceso al objeto de clase y a las instancias de la clase .

Para usar monikers de clase, debe usar la función CreateClassMoniker para crear estos monikers.

Implementación del moniker de archivo

Los monikers de archivo son monikers que representan una ruta de acceso en el sistema de archivos; Un moniker de archivo puede identificar cualquier objeto guardado en su propio archivo. Para identificar objetos contenidos en un archivo, puede componer monikers de otras clases (por ejemplo, monikers de elemento) a la derecha de un moniker de archivo. Sin embargo, el moniker a la izquierda de un moniker de archivo dentro de una composición debe ser otro moniker de archivo, un anti-moniker o un moniker de clase. Por ejemplo, es ilegal que un moniker de elemento aparezca a la izquierda de un moniker de archivo en un compuesto.

Tenga en cuenta que un anti-moniker es el inverso de un moniker de archivo completo, no el inverso de un componente de la ruta de acceso que representa el moniker; es decir, cuando se crea un anti-moniker a la derecha de un moniker de archivo, se quita el moniker de archivo completo. Si desea quitar solo el componente más a la derecha de la ruta de acceso representada por un moniker de archivo, debe crear un moniker de archivo independiente basado en la ruta de acceso ".." y, a continuación, redactarlo al final del moniker de archivo.

Un cliente de moniker (mediante un moniker para obtener un puntero de interfaz a un objeto) no suele necesitar conocer la clase del moniker; simplemente puede llamar a métodos mediante un puntero de interfaz IMoniker .

Un proveedor de moniker (entrega de monikers que identifican sus objetos para que sean accesibles para los clientes de moniker) debe usar monikers de archivos si los objetos que identifican se almacenan en archivos. Si cada objeto reside en su propio archivo, los monikers de archivo son el único tipo necesario. Si los objetos identificados son más pequeños que un archivo, debe usar otro tipo de moniker (por ejemplo, monikers de elemento) además de monikers de archivo.

Para usar monikers de archivo, debe usar la función CreateFileMoniker para crear los monikers. Para permitir que los objetos se carguen cuando se enlaza un moniker de archivo, los objetos deben implementar la interfaz IPersistFile .

El ejemplo más común de proveedores de moniker son aplicaciones de servidor COM que admiten la vinculación. Si la aplicación de servidor COM solo admite la vinculación a documentos basados en archivos en su totalidad, los monikers de archivo son el único tipo de moniker que necesita. Si la aplicación de servidor COM admite la vinculación a objetos menores que un documento (como secciones de un documento o objetos incrustados), debe usar monikers de elementos, así como monikers de archivo.

Implementación de moniker compuesto genérico

Un moniker compuesto genérico es un moniker compuesto cuyos componentes no tienen ningún conocimiento especial entre sí.

La composición es el proceso de unir dos monikers juntos. A veces se pueden combinar dos monikers de clases específicas de manera especial; por ejemplo, un moniker de archivo que representa una ruta de acceso incompleta y otro moniker de archivo que representa una ruta de acceso relativa se puede combinar para formar un único moniker de archivo que represente la ruta de acceso completa. Este es un ejemplo de composición no genérica. Por otro lado, la composición genérica puede conectar dos monikers, independientemente de sus clases. Dado que una composición no genérica depende de la clase de los monikers implicados, solo se puede realizar mediante la implementación de una clase determinada del método IMoniker::ComposeWith . Puede definir nuevos tipos de composiciones no genéricas si escribe una nueva clase de moniker. Por el contrario, las composiciones genéricas se realizan mediante la función CreateGenericComposite .

Un cliente de moniker (mediante un moniker para obtener un puntero de interfaz a un objeto) no suele necesitar conocer la clase del moniker o si es un compuesto genérico o un compuesto no genérico; simplemente puede llamar a métodos mediante un puntero de interfaz IMoniker .

Un proveedor de moniker (entrega de monikers que identifican sus objetos para que sean accesibles para los clientes de moniker) puede necesitar componer dos monikers juntos. (Por ejemplo, si usa un moniker de elemento para identificar un objeto, debe redactarlo con el moniker que identifica el contenedor del objeto antes de entregarlo). Use el método IMoniker::ComposeWith para ello, llamando al método en el primer moniker y pasando el segundo moniker como parámetro; Este método puede producir una composición genérica o no genérica.

La única vez que debe crear explícitamente un moniker compuesto genérico es cuando se escribe su propia clase de moniker. En la implementación de IMoniker::ComposeWith, debe intentar realizar una composición no genérica siempre que sea posible; Si no puede realizar una composición no genérica y la composición genérica es aceptable, puede llamar a la función CreateGenericComposite para crear un moniker compuesto genérico.

Implementación del moniker de elemento

Los monikers de elementos se usan para identificar objetos dentro de contenedores, como una parte de un documento, un objeto incrustado dentro de un documento compuesto o un rango de celdas dentro de una hoja de cálculo. Los monikers de elementos se usan a menudo en combinación con monikers de archivo; Se usa un moniker de archivo para identificar el contenedor mientras se usa un moniker de elemento para identificar el elemento dentro del contenedor.

Un moniker de elemento contiene una cadena de texto; el objeto contenedor usa esta cadena para distinguir el elemento contenido de los demás. El objeto contenedor debe implementar la interfaz IOleItemContainer ; esta interfaz permite que el código de moniker de elemento adquiera un puntero a un objeto, dado solo la cadena que identifica el objeto.

Un cliente de moniker (mediante un moniker para obtener un puntero de interfaz a un objeto) no suele necesitar conocer la clase del moniker; simplemente llama a métodos mediante un puntero de interfaz IMoniker .

Un proveedor de moniker (entrega de monikers que identifican sus objetos para que sean accesibles para los clientes de moniker) debe usar monikers de elementos si los objetos identificados están incluidos en otro objeto y se pueden identificar individualmente mediante una cadena. Use otro tipo de moniker (por ejemplo, monikers de archivo) para identificar el objeto contenedor.

Para usar monikers de elemento, debe usar la función CreateItemMoniker para crear los monikers. Para permitir que los objetos se carguen cuando se enlaza un moniker de elemento, el contenedor de los objetos debe implementar la interfaz IOleItemContainer .

El ejemplo más común de proveedores de moniker son aplicaciones COM que admiten la vinculación. Si la aplicación COM admite la vinculación a objetos menores que un documento basado en archivos, debe usar monikers de elementos. Para una aplicación de servidor que permite vincular a una selección dentro de un documento, se usan los monikers de elementos para identificar esos objetos. Para una aplicación contenedora que permite vincular objetos incrustados, se usan los monikers de elementos para identificar los objetos incrustados.

Implementación del moniker de OBJREF

Los monikers de OBJREF representan una referencia a una instancia de objeto que se ejecuta en un servidor fuera de proceso, ya sea de forma local o remota. El moniker identifica la instancia de objeto y el equipo en el que se ejecuta el objeto.

Un moniker OBJREF es similar de muchas maneras a un moniker de puntero, salvo que el objeto en ejecución está fuera de proceso. Un cliente puede llamar a IMoniker::BindToObject en un moniker OBJREF y usar el puntero que obtiene para acceder al objeto en ejecución, independientemente de su ubicación.

Una distinción importante de un moniker de puntero es que el nombre para mostrar de un moniker OBJREF se puede incrustar en una página HTML y el objeto en ejecución representado por el moniker puede estar enlazado por un script de cliente, applet o control ActiveX.

El uso principal de un moniker OBJREF es obtener acceso a una instancia de objeto en ejecución a través de Internet. Una página de servidor activa o algún otro medio para generar contenido HTML dinámico coloca el nombre para mostrar de un moniker OBJREF en un parámetro para un applet o un control ActiveX. El código del applet o control llama a la función CreateObjrefMoniker para crear un moniker OBJREF basado en el nombre para mostrar y, a continuación, llama a IMoniker::BindToObject en el moniker OBJREF resultante para obtener acceso a la instancia de objeto en ejecución. A continuación, la página del servidor activo serializa un puntero al objeto en ejecución al cliente de la página.

Implementación del moniker de puntero

Un moniker de puntero básicamente encapsula un puntero de interfaz para que parezca un moniker y se pueda pasar a esas interfaces que requieren monikers. El enlace de un moniker de puntero se realiza mediante una llamada al método QueryInterface del puntero.

Las instancias de monikers de puntero se niegan a serializarse; Es decir, IPersistStream::Save devolverá un error. Sin embargo, estos monikers pueden serializarse en un proceso diferente en una llamada RPC; internamente, el sistema serializa y anula la selección del puntero mediante el paradigma estándar para serializar punteros de interfaz.

Los monikers de puntero rara vez son necesarios. Use monikers de puntero solo si necesita monikers para identificar objetos que no tienen ninguna representación persistente. Los monikers de puntero permiten que estos objetos participen en una operación de enlace de moniker.

Implementación del moniker de dirección URL

La implementación de moniker url de IMoniker se encuentra en un objeto de moniker de dirección URL, que también admite IUnknown y la interfaz IAsyncMoniker . La interfaz IMoniker hereda su definición de IPersistStream , así como IUnknown, y IPersistStream hereda de IPersist. Por lo tanto, la implementación de IMoniker incluye compatibilidad con IPersistStream e IPersist.

La interfaz IAsyncMoniker es simplemente IUnknown. (No hay métodos adicionales). Se usa para permitir que los clientes determinen si un moniker admite el enlace asincrónico.

Para obtener un puntero a la interfaz IMoniker de este objeto, llame a la función CreateURLMonikerEx .

Un cliente de moniker (mediante un moniker para obtener un puntero de interfaz a un objeto) no suele necesitar conocer la clase del moniker que está usando; simplemente llama a métodos mediante un puntero de interfaz IMoniker .

Un proveedor de moniker (entrega de monikers que identifican sus objetos para que sean accesibles para los clientes de moniker) debe usar monikers de elementos si los objetos que identifica se encuentran dentro de otro objeto y se pueden identificar individualmente mediante una cadena. También tendrá que usar otro tipo de moniker (por ejemplo, monikers de archivo) para identificar el objeto contenedor.

Para usar monikers de elemento, debe usar la función CreateItemMoniker para crear los monikers. Para permitir que los objetos se carguen cuando se enlaza un moniker de elemento, el contenedor de los objetos debe implementar la interfaz IOleItemContainer .

El ejemplo más común de proveedores de moniker son aplicaciones COM que admiten la vinculación. Si la aplicación COM admite la vinculación a objetos menores que los documentos basados en archivos, debe usar monikers de elementos. Para una aplicación de servidor que permite vincular a una selección dentro de un documento, se usan los monikers de elementos para identificar esos objetos. Para una aplicación contenedora que permite vincular objetos incrustados, se usan los monikers de elementos para identificar los objetos incrustados.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows 2000 Server [aplicaciones de escritorio | Aplicaciones para UWP]
Plataforma de destino Windows
Encabezado objidl.h

Consulte también

CreateAntiMoniker

CreateClassMoniker

CreateFileMoniker

CreateGenericComposite

CreateItemMoniker

CreateObjrefMoniker

CreateURLMonikerEx

Monikers