Asynchronous Versus Synchronous Binding

The client may check to see if the moniker is asynchronous by calling the IsAsyncMoniker API function. If the client returns the BINDF_ASYNCHRONOUS flag, rather than returning an object pointer or a storage pointer from subsequent calls to IMoniker::BindToStorage or IMoniker::BindToObject, the moniker returns MK_S_ASYNCHRONOUS in place of the object pointer and NULL in place of the storage pointer. In response, the client should wait to receive the requested object or storage during IBindStatusCallback::OnDataAvailable and IBindStatusCallBack::OnObjectAvailable.

The callback object also receives progress notification through IBindStatusCallback::OnProgress, data availability notification through IBindStatusCallback::OnDataAvailable, and various other notifications from the moniker about the status of the binding operation.

If the client does not return the BINDF_ASYNCHRONOUS flag from the moniker's call to GetBindInfo, the bind operation will proceed synchronously, and the desired object or storage will be returned from subsequent calls to IMoniker::BindToObject or IMoniker::BindToStorage. Similarly, if the client desires synchronous operation and does not wish to receive any progress notifications or callbacks, it can request an asynchronous moniker to behave synchronously by not implementing IBindStatusCallback. In such cases, the asynchronous moniker will behave like a standard synchronous moniker.