更新:2007 年 11 月
ASYNC 属性示例创建一个从 URL 异步下载数据的控件。该控件实现 IBindStatusCallback 接口。对于很大的二进制对象或属性通常都采用异步下载的方式。这样可使控件的用户界面在可能的长时间的网络操作中保持不被阻塞。使用异步下载还使用户有机会中止下载。ATL 在内部使用 WinInet 函数实现异步下载。
ASYNC 示例为该示例的非属性化版本。
| .gif) 安全说明: | 
|---|
| 提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。 | 
获取示例和安装示例的说明:
- 在 Visual Studio 的“帮助”菜单上,单击“示例”。 - 有关更多信息,请参见定位示例文件。 
- 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。 
- 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。 
生成并运行示例
生成并运行此示例
- 打开解决方案文件 async.sln。 
- 在“生成”菜单中,单击“生成解决方案”。 
- 示例生成后,在 Web 浏览器中打开 ATLAsync.htm,并按照其说明进行操作。这将设置 ASYNC 控件的 URL 属性并开始下载。在数据下载过程中,您会看到数据在 ASYNC 控件中显示。 
可以在 ActiveX 控件测试容器中测试控件。有关访问测试容器和用它来测试控件的详细信息,请参见用测试容器测试属性和事件。
示例的工作机制
ASYNC 使用一个名为 URL 的属性创建子类编辑控件 (Edit Control)。URL 属性是表示指向数据的 URL 的 BSTR。ASYNC 示例使用 ATL CBindStatusCallback 类实现异步下载。当控件用户设置 URL 属性时,ASYNC 创建 CBindStatusCallback 对象。然后调用 CBindStatusCallback::StartAsyncDownload 方法,并向它传递此 URL 和指向回调函数的指针。此函数(即 CAtlAsync::OnData)由 CBindStatusCallback 对象调用,并在收到 URL 时向它传递 URL 中的二进制数据。CAtlAsync::OnData 只是将收到的数据发送到子类编辑控件 (Edit Control),并在那里显示该数据。
有关如何使用 ATL 为 Windows 控件创建超类的示例,请参见 ATL SUBEDIT 示例。
属性
此示例使用下面的属性:
coclass、default、dual、helpstring、id、implements_category、in、module、object、out、pointer_default、progid、propget、propput、registration_script、retval、threading、uuid、version、vi_progid
关键字
此示例使用以下关键字:
ALT_MSG_MAP、ATLTRACE、BEGIN_COM_MAP、BEGIN_MSG_MAP、BEGIN_OBJECT_MAP、BEGIN_PROPERTY_MAP、CBindStatusCallback::Download、CComBSTR::Append、CComCoClass、CComControl、CComModule::GetClassObject、CComModule::GetLockCount、CComModule::Init、CComModule::RegisterServer、CComModule::Term、CComModule::UnregisterServer、CComObjectRoot、COM_INTERFACE_ENTRY、COM_INTERFACE_ENTRY_IMPL、DECLARE_REGISTRY_RESOURCEID、DisableThreadLibraryCalls、DLL_PROCESS_ATTACH、DLL_PROCESS_DETACH、DllMain、END_COM_MAP、END_MSG_MAP、END_OBJECT_MAP、END_PROPERTY_MAP、IDataObjectImpl、IDispatchImpl、IObjectSafetyImpl、IOleControlImpl、IOleInPlaceActiveObjectImpl、IOleInPlaceObjectWindowlessImpl、IOleInPlaceObjectWindowlessImpl::SetObjectRects、IOleObjectImpl、IPerPropertyBrowsingImpl、IPersistPropertyBagImpl、IPersistStorageImpl、IPersistStreamInitImpl、IProvideClassInfo2Impl、IQuickActivateImpl、IsWindow、IViewObjectExImpl、MESSAGE_HANDLER、OBJECT_ENTRY、PROP_ENTRY、SendMessage、USES_CONVERSION
| .gif) 说明: | 
|---|
| 其中某些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。 |