伴随 Windows 发展已超 25 年的 Raymond Chen,刚刚在一篇《The Old New Thing》开发者博客嘲笑系统剪贴板(clipboard)所谓存在的最大数据限制Bug 。他以行数 30 万 以大型电子表格文件为例。当用户打开并将其复制到剪贴板上时,他们在粘贴到另一个应用程序时会遇到问题。
假设使用此应用程序 Get-Clipboard-Data 以富文本格式检索数据的函数。然后你会后悔发现 —— 函数回到了空值(NULL)。
很多人可能会猜测,这个问题可能与剪贴板的数据上限有关。
然而 Raymond Chen 并非如此 。
剪贴板未预设可提取数据的最大值,其内容仅限于可用内存和地址空间。
为避免 Get-Clipboard-Data 调用失败主要有两种替代方案 —— 一种是将数据直接放在剪贴板上,另一种是声明有特定类型的数据,而不是直接放在剪贴板上。
对于很少使用或生成资源消耗过高的数据格式,常见的优化方案是使用剪贴板的延迟渲染(delay-rendered)。
然后,当被问及数据格式时,数据源用户将收到一个 WM_RENDERFORMAT 消息 —— 有人想调用这个数据,你选择立即生成吗?
Raymon Chen解释称:
Excel 它本身不能以富文本的形式运行,放置在剪贴板上的数据被延迟渲染。
当另一个程序要求提供富文本格式数据时,Excel 会给出这样的回应 —— 哦,好的,请稍等,我帮你拿。
富文本不是数据表的最佳格式,因为它主要是为文本设计的。即使你能得到一个简单的表格,更复杂的任务也不会顺利运行。
当系统要求剪贴板的所有者显示数据时,它会发送信息并等待最多 30 秒返回。
若未能在 30 如果数据在秒内生成,系统将放弃请求并导致 GetClipboardData 返回 NULL 空值。
本例的问题在于原表太大,导致 Excel 需要超过 30 富文本格式表只能在秒内生成。后续开发团队将设想通过特殊手段延长等待时间。