' ΠΏΡΠΎΡΠΈΠΌ gorilla Π΅ΡΡΡ Π±Π°Π½Π°Π½Ρ
ape.EatBanana
End Sub
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π²Π΅ΡΡΠΈΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Visual Basic ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IApeClass Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Visual Basic Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IClassFactory ΠΈΠ·-Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ΡΠ·ΡΠΊΠ°.
ΠΠΎΠ½ΠΈΠΊΠ΅ΡΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ
ΠΠΎΠ½ΠΈΠΊΠ΅ΡΡ ΡΠ°ΡΡΠΎ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠΎΠ², ΡΡΠΎΠ±Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΏΠΎ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². Π§ΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΠΏΡΠΎΡΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, Π² Π‘ΠΠ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΠ°Ρ, Π±ΡΠ΄ΡΡΠΈ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΉ ΡΠΏΡΠ°Π²Π° ΠΎΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ°, Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ²ΡΠ·Π°ΡΡ ΡΡΡΠ»ΠΊΡ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π² ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ. Π’Π°ΠΊΠΎΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° (Item Moniker) ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° IOleItemContainer Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ.
Π‘Π»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠΌΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π² ΡΠ°Π½Π΄Π΅ΠΌΠ΅ Ρ ΠΊΠ»Π°ΡΡΠΎΠ²ΡΠΌ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠΎΠΌ:
clsid:571F1680-CC83-11d0-8C48-0080C73925BA:!Ursus
ΠΡΠΌΠ΅ΡΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Π° "!" Π΄Π»Ρ ΠΎΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Class Moniker ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° (item name) Β«UrsusΒ». ΠΡΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ MkParseDisplayName ΡΠ½Π°ΡΠ°Π»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΡΠ΅ΡΠΈΠΊΡ "clsid " Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ProgID Π΄Π»Ρ ΠΊΠΎΠ½ΡΠ°ΠΊΡΠ° Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π‘lass Moniker. ΠΠ°ΡΠ΅ΠΌ MkParseDisplayName ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Class Moniker ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΡ ΡΡΡΠΎΠΊΠΈ β ΡΡΠΎΠ»ΡΠΊΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ½Π° ΡΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π‘lass Moniker ΠΈΠ·Π²Π»Π΅ΠΊ ΡΠ²ΠΎΠΉ GUID ΠΈΠ· ΡΡΡΠΎΠΊΠΈ, Π΅Π΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ Π²ΡΠ΅ Π΅ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΡΡΡ Π² Π°Π½Π°Π»ΠΈΠ·Π΅: !Ursus
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΠΈΠΌΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠΎΠΌ ΡΠ»Π΅Π²Π° ΠΎΡ Π½Π΅Π³ΠΎ, ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ MkParseDisplayName ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΡΠ°ΠΉΠ½Π΅ΠΌΡ Π»Π΅Π²ΠΎΠΌΡ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΡ (ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°) ΠΈ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ½ ΠΈΠΌΠ΅Π½ΡΠ΅Ρ (ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Gorilla) ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΡΠ°Π²ΡΡΡΡΡ ΡΠ°ΡΡΡ ΡΡΡΠΎΠΊΠΈ. ΠΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΡ ΠΈΠΌΠ΅Π½ Π‘ΠΠ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IParseDisplayName:
[ object,uuid(0000011a-0000-0000-C000-000000000046) ]
interface IParseDisplayName : IUnknown
{
// convert display name to a moniker
// ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠΌΡ Π² ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ
HRESULT ParseDisplayName( [in, unique] IBindCtx *pbc, [in] LPOLESTR pszDisplayName, [out] ULONG *pchEaten, [out] IMoniker **ppmkOut );
}
Π ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΊΠ»Π°ΡΡΠ° Gorilla ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ IParseDisplayName ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΡΡΡΠΎΠΊΡ "!Ursus" Π² ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ MkParseDisplayName ΠΏΠΎΡΡΠ°Π²ΠΈΡ ΡΠΏΡΠ°Π²Π° ΠΎΡ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ° ΠΊΠ»Π°ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΡΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ:
STDMETHODIMP GorillaClass::ParseDisplayName(IBindCtx *pbc, LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut)
{
// create an item moniker using explicit API function
// ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ²Π½ΡΡ API-ΡΡΠ½ΠΊΡΠΈΡ
HRESULT hr = CreateItemMoniker(OLESTR("!"), pszDisplayName + 1, ppmkOut);
// indicate how many characters were parsed
// ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π±ΡΠ»ΠΎ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΎ
if (SUCCEEDED(hr)) *pchEaten = wcslen(pszDisplayName);
else *pchEaten = 0; return hr;
}
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½Π΅ Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠΠ΄Π΅ΡΡ ΠΏΡΠΎΡΡΠΎ ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» "!", ΠΈ ΠΈΠ· ΠΎΡΡΠ°Π²ΡΠ΅ΠΉΡΡ ΡΠ°ΡΡΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°.
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΎ Π΄Π²Π° ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ°, ΡΠΎ MkParseDisplayName Π±ΡΠ΄Π΅Ρ ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΡΡΠΈ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΡ Π²ΠΌΠ΅ΡΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π³ΡΡΠΏΠΏΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ½ΡΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ (generic composite moniker). ΠΡΡΠΏΠΏΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ½ΡΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π΄Π²Π° ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ° Π²ΠΌΠ΅ΡΡΠ΅. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π³ΡΡΠΏΠΏΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ° BindToObject ΡΠ½Π°ΡΠ°Π»Π° ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΡΠΏΡΠ°Π²Π°, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π΅ΠΌΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΡΠ»Π΅Π²Π° ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ pmkToLeft. ΠΡΠΎ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ΠΎΠΌ:
// pseudo-code from OLE32.0LL
// ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ ΠΈΠ· OLE32.DLL
STDMETHODIMP GenericComposite::BindToObject (IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riid, void **ppv)
{
return m_pmkRight->BindToObject(pbc, m_pmkLeft, riid, ppv);
}
ΠΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΡΠΏΡΠ°Π²Π° ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ°ΡΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ°, Π½Π°Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎΡΡ ΡΠ»Π΅Π²Π° ΠΎΡ Π½Π΅Π³ΠΎ. Π ΡΠ»ΡΡΠ°Π΅ Π³ΡΡΠΏΠΏΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΏΠΎΠ»ΡΡΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ²ΡΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ pmkToLeft Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ.
Π Π°Π½Π΅Π΅ ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ, ΡΡΠΎ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IOleItemContainer Π΄Π»Ρ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΠΎΠ³ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠindToObject:
// pseudo-code from OLE32.DLL
// ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ ΠΈΠ· OLE32.DLL
STDMETHODIMP ItemMoniker::BindToObject(
IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riid, void **ppv)
{
// assume failure
// Π΄ΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ±ΠΎΡ
*ppv = 0;
if (pmkToLeft == 0)
//requires a scope β ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±Π»Π°ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ return
E_INVALIDARG;
// first bind moniker to left
// ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ ΡΠ»Π΅Π²Π°
IOleItemContainer *poic = 0;
HRESULT hr = pmkToLeft->BindToObject(pbc, 0, IID_IOleItemContainer, (void**)&poic);
if (SUCCEEDED(hr))
{
// cache the bound object in binding context
// ΠΊΡΡΠΈΡΡΠ΅ΠΌ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ
pbc->RegisterObjectBound(poic);
// get bind speed from Bind Context
// ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π±ΡΡΡΡΠΎΡΡ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ
DWORD dwBindSpeed = this->MyGetSpeedFromCtx(pbc);
// ask object for named sub-object
// Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠ± ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅ΠΊΡΠ΅
hr = poic->GetObject(m_pszItem, dwBindSpeed, pbc, riid, ppv);
poic->Release();
}
}
ΠΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:
HRESULT GetUrsus(IApe *&rpApe)
{
const OLECHAR pwsz[] = OLESTR(Β«clsid:571F1680-CC83-11d0-8C48-0080C73925BA:!UrsusΒ»);
return CoGetObject(pwsz, 0, IID_IApe, (void**)&rpApe);
}
ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ΅Π½ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ:
HRESULT GetUrsus(IApe *&rpApe) {
IOleItemContainer *poic = 0;
HRESULT hr = CoGetClassObject(CLSID_Gorilla, CLSCTX_ALL,
0, IID_IOleItemContainer, (void**)&poic);
if (SUCCEEDED(hr)) {
hr = poic->GetObject(OLESTR(Β«UrsusΒ»), BINDSPEED_INFINITE,
0, IID_IApe, (void**)&rpApe);
poic->Release();
}
return hr; }
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΡΡΠΎΠ²Π΅Π½Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ (indirection), ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½Π½ΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ CoGetObject, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠ΅Π½ΡΡΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΡΡΠΎ ΠΏΡΡΠ΅ΠΌ ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΡ ΠΈΠΌΠ΅Π½ ΠΈΠ· ΡΠ°ΠΉΠ»Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΈΠ· ΠΊΠ»ΡΡΠ° ΡΠ΅Π΅ΡΡΡΠ°.
ΠΠΎΠ½ΠΈΠΊΠ΅ΡΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌΠΎΡΡΡ
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠΎΠ² Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π½ΡΠΌ Π±Π΅Π· ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ° (File Moniker). ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ Π‘ΠΠ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΡΡΠΈ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π° Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ: ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΠΊΠ»Π°ΡΡΠ°, ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΊ Π½ΠΎΠ²ΡΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌ ΠΊΠ»Π°ΡΡΠ° ΠΈ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΊ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ, Ρ ΡΠ°Π½ΡΡΠΈΠΌΡΡ Π² ΡΠ°ΠΉΠ»Π°Ρ . Π Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈΡΡ ΠΏΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π° ΠΈΠ· ΡΡΠΈΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ². Π’ΡΠ΅ΡΠΈΠΉ ΠΏΡΠΈΠΌΠΈΡΠΈΠ² ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° API-ΡΡΠ½ΠΊΡΠΈΠΈ Π‘ΠΠ CoGetInstanceFromFile:
HRESULT CoGetInstanceFromFile( [in, unique] COSERVERINFO *pcsi,
// host/security info β ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Ρ ΠΎΡΡΠ΅/Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
[in, unique] CLSID *pClsid,
// explicit CLSID (opt) β ΡΠ²Π½ΡΠΉ CLSID (opt)
[in, unique] IUnknown *punk0uter,
// for aggregation β Π΄Π»Ρ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
[in] DWORD dwClsCtx,
// locality? β Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡ?
[in] DWORD grfMode,
// file open mode β ΡΠ΅ΠΆΠΈΠΌ ΠΎΡΠΊΡΡΡΠΈΡ ΡΠ°ΠΉΠ»Π°
[in] OLECHAR *pwszName,
// file name of object β ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ΅ ΠΈΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
[in] DWORD cmqi,
// how many interfaces? β ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ²?
[out, size_is(cmqi)] MULTI_QI *prgmq
// where to put itfs β ΠΊΡΠ΄Π° ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ
);
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½Π° Π²Ρ ΠΎΠ΄ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠΌΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ (persistent state) ΠΎΠ±ΡΠ΅ΠΊΡΠ°[1]. CoGetInstanceFromFile ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° (ΡΠ΅)Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. Π§ΡΠΎΠ±Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΡ ΡΠ°Π±ΠΎΡΡ, CoGetInstanceFromFile Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ CLSID Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. CLSID ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎ Π΄Π²ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ. ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, ΡΠΎ CLSID Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π‘ΠΠ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΠΎΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ (Π½Π°Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎΡΡ Π² ΡΠ°ΠΉΠ»Π΅) ΠΎΠ±ΡΠ°Π·Π°. ΠΠΎ-Π²ΡΠΎΡΡΡ , Π΅ΡΠ»ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Ρ ΠΎΡΡ-ΠΈΠΌΡ Π΄ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° Π°ΠΊΡΠΈΠ²Π°ΡΠΈΡ, ΡΠΎ Π‘ΠΠ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ CLSID Π΄Π»Ρ Π²ΡΡΡΠ½Π΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ, Π½Π° ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ[2].
ΠΡΠ»ΠΈ CLSID Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠ²Π½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, ΡΠΎ CoGetInstanceFromFile ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ CLSID ΠΈΠ· ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° API-ΡΡΠ½ΠΊΡΠΈΠΈ Π‘ΠΠ GetClassFile:
HRESULT GetClassFile([in, string) OLECHAR *pwszFileName, [out] CLSID *pclsid);
ΠΠ»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎΡΡ Π² ΡΠ°ΠΉΠ»Π΅, GetClassFile ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· ΡΠ΅Π΅ΡΡΡΠ°.
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΠΊΠ»Π°ΡΡ ΠΈ Ρ ΠΎΡΡ-ΠΌΠ°ΡΠΈΠ½Π°, Π‘ΠΠ ΠΈΡΡΠ»Π΅Π΄ΡΠ΅Ρ ROT (Running Object Table β ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΠΈΡ ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²) Π½Π° ΡΠ΅Π»Π΅Π²ΠΎΠΉ Ρ ΠΎΡΡ-ΠΌΠ°ΡΠΈΠ½Π΅ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΡΡΠ½ΠΈΡΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΆΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ. Π’Π°Π±Π»ΠΈΡΠ° ROT ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ SCM, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠ΅ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΡ Π² ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΠΈΡ ΡΡ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ Ρ ΠΎΡΡ-ΠΌΠ°ΡΠΈΠ½Π΅. ΠΠΆΠΈΠ΄Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±ΡΠ΄ΡΡ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π±Ρ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ROT Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ. Π§ΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ΅ ΠΈΠΌΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ°, Π‘ΠΠ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΡΠΈΠΏ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠ° β ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ ΠΌΠΎΠ½ΠΈΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IMoniker. Π€Π°ΠΉΠ»ΠΎΠ²ΡΠ΅ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΡ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡΡΡ Π»ΠΈΠ±ΠΎ ΠΏΡΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π² ΠkParseDisplayName , Π»ΠΈΠ±ΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΠ²Π½ΠΎΠΉ API-ΡΡΠ½ΠΊΡΠΈΠΈ CreateFileMoniker: