Objektmonikers
En annan OLE-implementerad moniker-klass är objektmoniker, som kan användas för att identifiera ett objekt som finns i ett annat objekt. En typ av inneslutet objekt är ett OLE-objekt som är inbäddat i ett sammansatt dokument. Ett sammansatt dokument kan identifiera de inbäddade objekt som det innehåller genom att tilldela vart och ett godtyckligt namn, till exempel "embedobj1", "embedobj2" och så vidare. En annan typ av inneslutet objekt är en användarmarkering i ett dokument, till exempel ett cellområde i ett kalkylblad eller ett teckenintervall i ett textdokument. Ett objekt som består av en markering kallas för ett pseudoobjekt eftersom det inte behandlas som ett distinkt objekt förrän en användare markerar markeringen. Ett kalkylblad kan identifiera ett cellområde med ett namn som "1A:7F", medan ett ordbehandlingsdokument kan identifiera ett teckenintervall med namnet på ett bokmärke.
En objektmoniker är främst användbar när den sammanfogas, eller består, med en annan moniker, en som identifierar containern. Ett objektmoniker skapas vanligtvis och skapas sedan på (till exempel) en filmoniker för att skapa motsvarigheten till en fullständig sökväg till objektet. Du kan till exempel skriva filmonikern "c:\work\report.doc" (som identifierar containerobjektet) med objektmonikern "embedobj1" (som identifierar ett objekt i containern) för att bilda monikern "c:\work\report.doc\embedobj1", som unikt identifierar ett visst objekt i en viss fil. Du kan också sammanfoga ytterligare objektmonikers för att identifiera djupt kapslade objekt. Om till exempel "embedobj1" är namnet på ett kalkylbladsobjekt kan du för att identifiera ett visst cellområde i kalkylbladsobjektet lägga till en annan objektmoniker för att skapa en moniker som motsvarar "c:\work\report.doc\embedobj1\1A:7F".
I kombination med en filmoniker utgör en objektmoniker en fullständig sökväg. Objektmonikers utökar därmed begreppet sökvägsnamn bortom filsystemet och definierar sökvägsnamn för att identifiera enskilda objekt, inte bara filer.
Det finns en betydande skillnad mellan en objektmoniker och en filmoniker. Sökvägen i en filmoniker är meningsfull för alla som förstår filsystemet, medan den partiella sökvägen i en objektmoniker bara är meningsfull för en viss container. Alla vet vad "c:\work\report.doc" refererar till, men bara ett visst containerobjekt vet vad "1A:7F" refererar till. En container kan inte tolka en objektmoniker som skapats av ett annat program. den enda container som vet vilket objekt som refereras till av en objektmoniker är containern som tilldelade objektet moniker till objektet i första hand. Av den anledningen måste källan till objektet som namnges av kombinationen av en fil- och objektmoniker inte bara implementera IPersistFile, för att underlätta bindning av filmonikern, utan också IOleItemContainer för att underlätta lösningen av objektets moniker till lämpligt objekt, i samband med en fil.
Fördelen med monikers är att någon som använder en moniker för att hitta ett objekt inte behöver förstå namnet som finns i objektmonikern, så länge objektmonikern är en del av en sammansatt. I allmänhet skulle det inte vara meningsfullt att en objektmoniker finns på egen hand. I stället skulle du skriva ett objektmoniker till en filmoniker. Du anropar sedan IMoniker::BindToObject på kompositen, som binder enskilda monikers inom den och tolkar namnen.
Om du vill skapa ett objektmoniker-objekt och returnera dess pekare till monikerprovidern tillhandahåller OLE hjälpfunktionen CreateItemMoniker. Den här funktionen skapar ett objektmonikerobjekt och returnerar pekaren till providern.
Relaterade ämnen