当前位置: 首页 > news >正文

翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)

What a drag: Dragging a virtual file (IStream edition) - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20080319-00/?p=23073

Raymond Chen 2008年03月19日


拖拽虚拟文件(IStream 版本)

        上一次,我们看到了如何拖拽一个虚拟文件,其内容以内存中的字节块(HGLOBAL)形式表示。通常,字节块不是表示虚拟文件内容的便捷方式。你可能更倾向于以流的形式来表示它。例如,内容可能是动态生成的(比如由算法输出),或者它可能来自外部来源(比如正在下载的网页)。让我们将上次的程序转换为以流的形式返回文件内容。我们需要做的首个更改是在我们的构造函数中,让它报告文件内容为流而不是HGLOBAL

#include <shlwapi.h> // 用于 SHOpenRegStreamCTinyDataObject::CTinyDataObject() : m_cRef(1)
{SetFORMATETC(&m_rgfe[DATA_FILEGROUPDESCRIPTOR],RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR));SetFORMATETC(&m_rgfe[DATA_FILECONTENTS],RegisterClipboardFormat(CFSTR_FILECONTENTS),TYMED_ISTREAM, /* lindex */ 0);
}

        接下来,我们需要在IDataObject::GetData处理器中产生该流及其对应的描述符:

HRESULT CTinyDataObject::GetData(FORMATETC *pfe, STGMEDIUM *pmed)
{ZeroMemory(pmed, sizeof(*pmed));switch (GetDataIndex(pfe)) {case DATA_FILEGROUPDESCRIPTOR:{FILEGROUPDESCRIPTOR fgd;ZeroMemory(&fgd, sizeof(fgd));fgd.cItems = 1;StringCchCopy(fgd.fgd[0].cFileName,ARRAYSIZE(fgd.fgd[0].cFileName),TEXT("Dummy"));pmed->tymed = TYMED_HGLOBAL;return CreateHGlobalFromBlob(&fgd, sizeof(fgd),GMEM_MOVEABLE, &pmed->hGlobal);}case DATA_FILECONTENTS:pmed->tymed = TYMED_ISTREAM;pmed->pstm = SHOpenRegStream(HKEY_LOCAL_MACHINE,TEXT("Hardware\\Description\\System\\CentralProcessor\\0"),TEXT("~MHz"), STGM_READ);// 正确设置流位置if (pmed->pstm) {LARGE_INTEGER liZero = { 0, 0 };pmed->pstm->Seek(liZero, STREAM_SEEK_SET, NULL);}return pmed->pstm ? S_OK : E_FAIL;}return DV_E_FORMATETC;
}

        当然,在现实生活中,你会使用一个更有趣的流而不是你的CPU速度。我只是选择了那个作为例子。

        和基于HGLOBAL的数据对象一样,你可以将这个数据对象拖放到资源管理器文件夹中创建文件,拖放到Outlook消息中创建附件,以及任何支持Shell虚拟文件传输模型的地方。和HGLOBAL示例一样,你可以在FILEGROUPDESCRIPTOR中设置各种可选信息,以使传输更顺畅,特别是预期的流大小。但我不会再深入讨论,因为这一系列文章的主题是“这是你能做的最少”。

        但你已经知道足够多的信息来解决这个客户的问题:

我们需要知道用户将文件拖放到了哪个目录。我们需要从另一台计算机传输数据,所以我们的做法是让用户拖拽一个单一的虚拟文件,然后一旦我们知道用户将虚拟文件拖放到了哪里,我们可以进去,删除虚拟文件,并开始从远程计算机传输数据并将其保存到目标目录中的真正文件中。

        下次,我们将看看用于文件传输的最终存储介质,TYMED_ISTORAGE

 

http://www.lryc.cn/news/359236.html

相关文章:

  • 【FPGA】Verilog语言从零到精通
  • unity打包的WebGL部署到IIS问题
  • GPT-4o:人工智能的新里程碑
  • 发现一个ai工具网站
  • 第二十五章新增H5基础(以及视频~兼容)
  • [英语单词] production quality
  • windows安装nodeJs,以及常用操作
  • MySql part1 安装和介绍
  • SpringBoot打war包并配置外部Tomcat运行
  • 2024.5.31每日一题
  • Oracle 数据库 varchar2 从 4000 扩展到 32k
  • postgressql——事务提交会通过delayChkpt阻塞checkpoint(9)
  • 开发者工具-sources(源代码选项)
  • 没有 rr 头的 kamailio 路由脚本
  • mysql 分区
  • 在龙芯安装docker compose
  • 纯C++做多项式拟合
  • vulnhub靶场之FunBox-9
  • C# 变量与参数详解
  • CentOS7.9部署安装OpenGauss 5.0.2企业版
  • java基础-chapter15(io流)
  • mysql去除重复数据
  • MySQL基础索引知识【索引创建删除 | MyISAM InnoDB引擎原理认识】
  • SJ601-II垂直法阻燃性能测试仪
  • 瑞吉外卖项目学习笔记(二)后台系统的员工管理业务开发
  • Unity OutLine 模型外描边效果
  • CRLF注入漏洞
  • 理解接口回调及其在 RabbitMQ 中的实际运用
  • 大模型日报2024-05-31
  • HarmonyOS 鸿蒙DevEco:导入无法运行提示Sync failed