# Asynchronous Versus Synchronous Monikers

A client of a stadard, synchronous OLE moniker typically creates and holds a reference to the moniker, as well as the bind-context to be used during binding. The components involved in using traditional monikers are shown in the following diagram.

Clients typically create standard monikers by calling APIs functions such as CreateFileMoniker, CreateItemMoniker, or CreatePointerMoniker or, because they are can be saved to persistent storage, through OleSaveToStream and OleLoadFromStream. Monikers may also be obtained from a container object by calling IBindHost::CreateMoniker. Clients create bind contexts by calling the CreateBindCtx API function, then pass the bind context to the moniker with calls to IMoniker::BindToStorage or IMoniker::BindToObject.

As shown in the following diagram, a client of an asynchronous moniker also creates and holds a reference to the moniker and bind-context to be used during binding.

In order to get asynchronous behavior, the client implements the IBindStatusCallback interface on a bind-status-callback object and calls the either the RegisterBindStatusCallback or CreateAsyncBindCtx API functions to register this interface with the bind-context. The moniker passes a pointer to its IBinding interface in a call to IBindStatusCallback::OnStartBinding. The client tells the asynchronous moniker how it wants to bind on return from the moniker’s call to IBindStatusCallback::GetBindInfo.