数据拉取模型和数据推送模型
异步名字对象的客户端可以在数据拉取和数据推送模型之间进行选择,以驱动异步 IMoniker::BindToStorage 操作和接收异步通知。 在数据拉取模型中,客户端会驱动绑定操作,并且名字对象仅在读取数据时向客户端提供数据。 换言之,在首次调用 IBindStatusCallback::OnDataAvailable 后,除非客户端已使用已提供的所有数据,否则名字对象不会向客户端提供任何数据。
由于仅在请求时下载数据,因此选择数据拉取模型的客户端必须确保及时读取此类数据。 如果使用 URL 名字对象进行 Internet 下载,并且客户端在请求更多数据之前等待的时间过长,则绑定操作可能会失败。
在数据推送模型中,名字对象驱动异步绑定操作,并在有新数据可用时持续通知客户端。 客户端可以选择是否在绑定操作期间的任何时间点读取数据,但不管怎样,名字对象都将推动绑定操作完成。
此外,在使用异步名字对象时,需要记住遵循 COM 规则进行内存分配,具体如下:
- 每当 COM 接口或函数调用将缓冲区(字符串等)返回到其客户端时,客户端都负责调用 CoTaskMemFree 来释放内存。
- 每当 COM 接口或函数需要来自其客户端的缓冲区时,客户端都必须使用 CoTaskMemAlloc 分配该缓冲区,并且被调用方必须释放该缓冲区。
在分配传递给异步名字对象的字符串或缓冲区时,请务必遵循这些规则,并记住释放异步名字对象返回的内存。 有关完整详细信息,请参阅管理内存分配和相关主题。
相关主题