IMoniker::BindToObject

"Binds" the moniker; that is, returns a pointer to the object identified by the moniker. The binding process involves finding the object, getting it into the running state if it's not already, and acquiring an interface pointer to it.

HRESULT BindToObject(

IBindCtx *pbc,
//Bind context to be used
IMoniker *pmkToLeft,
//Moniker that precedes this one in the composite
REFIID riidResult,
//IID of interface pointer requested
void **ppvResult
//Receives an interface pointer to the object
);

Parameters

pbc

[in] Points to the bind context to be used for this binding operation. The bind context caches objects bound during the binding process, contains parameters that apply to all operations using the bind context, and provides the means by which the moniker implementation should retrieve information about its environment. For more information, see IBindCtx.

pmkToLeft

[in] Points to the moniker to the left of this moniker, if this moniker is part of a composite. This parameter is primarily used by moniker implementors to enable cooperation between the various components of a composite moniker; moniker clients can usually pass NULL.

riidResult

[in] Specifies the IID of the interface pointer requested.

ppvResult

[out] Receives a pointer to the object identified by the moniker. If an error occurs, the implementation sets *ppvResult to NULL. If *ppvResult is non-NULL, the implementation must call IUnknown::AddRef on the parameter; it is the caller's responsibility to call IUnknown::Release.

Return Values

S_OK

The binding operation was successful.

MK_E_NOOBJECT

Indicates that the object identifed by this moniker, or some object identified by the composite moniker of which this moniker is a part, could not be found.

MK_E_EXCEEDEDDEADLINE

Indicates that the binding operation could not be completed within the time limit specified by the bind context's BIND_OPTS structure.

MK_E_CONNECTMANUALLY

Indicates a moniker whose binding requires assistance from the end user. You can retry the binding operation after showing the moniker's display name to request that the end user manually connect to the object. The most common reasons for returning this value are that a password is needed or that a floppy needs to be mounted. The caller should call IBindCtx::GetObjectParam with the key "ConnectManually" to retrieve the moniker that caused the error, get the display name, display a dialog box asking the user for a password, and so on.

MK_E_INTERMEDIATEINTERFACENOTSUPPORTED

An intermediate object was found but it did not support an interface required to complete the binding operation. For example, an item moniker returns this value if its container does not support the IOleItemContainer interface.

E_UNEXPECTED

Indicates an unexpected error.

E_OUTOFMEMORY

Indicates insufficient memory.

STG_E_ACCESSDENIED

Unable to access the storage object.

IOleItemContainer::GetObject errors

Binding to a moniker containing an item moniker can return any of the errors associated with this function.

Comments

The IMoniker::BindToObject method implements the primary function of a moniker: returning an interface pointer to the object identified by the moniker.

Notes to Callers

If you are using a moniker as persistent connection between two objects, you activate the connection by calling IMoniker::BindToObject.

You typically call IMoniker::BindToObject with the following steps:

  1. Create a bind context by calling the CreateBindCtx API function.

  2. Call the IMoniker::BindToObject method on the moniker, retrieving an interface pointer.

  3. Release the bind context.

  4. Use the interface pointer.

  5. Release the interface pointer.

Here's a code fragment that illustrates these steps:

// pMnk is an IMoniker * that points to a previously-acquired moniker

ICellRange *pCellRange;

IBindCtx *pbc;

CreateBindCtx( 0, &pbc );

pMnk->BindToObject( pbc, NULL, IID_ICellRange, &pCellRange );

pbc->Release();

// pCellRange now points to the object; safe to use pCellRange

pCellRange->Release();

You can also use the BindMoniker API function, which encapsulates the first three steps described above.

Note that link containers are a special case in that they typically don't need to call IMoniker::BindToObject directly. When a user activates a linked object, the link container can typically calls IOleObject::DoVerb. The link handler's implementation of IOleObject::DoVerb calls IMoniker::BindToObject on the moniker stored in the linked object (if it cannot handle the verb).

Notes to Implementors

What your implementation does depends on whether you expect your moniker to have a prefix, that is, whether you expect the pmkToLeft parameter to be NULL or not. For example, an item moniker, which identifies an object within a container, expects that pmkToLeft identifies the container. An item moniker consequently uses pmkToLeft to request services from that container. If you expect your moniker to have a prefix, you should use the pmkToLeft parameter (for instance, calling IMoniker::BindToObject on it) to request services from the object it identifies.

If you expect your moniker to have no prefix, your IMoniker::BindToObject implementation should first check the Running Object Table (ROT) to see if the object is already running. To acquire a pointer to the ROT, your implementation should call IBindCtx::GetRunningObjectTable on the pbc parameter. You can then call the IRunningObjectTable::GetObject method to see if the current moniker has been registered in the ROT. If so, you can immediately use IUnknown::QueryInterface to return the desired interface pointer.

When your IMoniker::BindToObject implementation binds to some object, it should call IBindCtx::RegisterObjectBound on the pbc parameter to store a reference to the bound object in the bind context. This ensures that the bound object remains running until the bind context is released, which can avoid the expense of having a subsequent binding operation load it again later.

If the bind context's BIND_OPTS structure specifies the BINDFLAGS_JUSTTESTEXISTENCE flag, your implementation has the option of returning NULL in *ppvResult (although you can also ignore the flag and perform the complete binding operation).

See Also

BindMoniker, IMoniker::BindToStorage

Software for developers
Delphi Components
.Net Components
Software for Android Developers
More information resources
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
Databases for Amazon shops developers
Amazon Categories Database
Browse Nodes Database