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

2024-06-01 06:44

本文主要是介绍翻译《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

 

这篇关于翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020264

相关文章

BD错误集锦5——java.nio.file.FileSystemException 客户端没有所需的特权

问题:在运行storm本地模式程序时,java.nio.file.FileSystemException  客户端没有所需的特权   解决方式:以管理员身份运行IDEA即可。

BD错误集锦1——[Hive]ERROR StatusLogger No log4j2 configuration file found. Using default configuration:

错误描述:在使用IDEA进行jdbc方式连接到hive数据仓库时,出现以下错误:                ERROR StatusLogger No log4j2 configuration file found. 问题原因:缺少log4j2.xml文件   <?xml version="1.0" encoding="UTF-8"?><Configuration><Appender

iOS:编译时出现no such file or directory:xxx以及use twice...filenames are used to distinguish private dec

简    注册  登录   添加关注 作者  婉卿容若 2016.04.29 11:22 写了21870字,被16人关注,获得了14个喜欢 iOS:编译时出现"no such file or directory:xxx"以及"use twice...filenames are used to distinguish private

Kimichat使用案例026:AI翻译英语PDF文档的3种方法

文章目录 一、介绍二、腾讯交互翻译TranSmart https://transmart.qq.com/三、沉浸式翻译三、谷歌网页翻译 一、介绍 短的文章,直接丢进kimichat、ChatGPT里面很快就可以翻译完成,而且效果很佳。但是,很长的PDF文档整篇需要翻译,怎么办呢? 二、腾讯交互翻译TranSmart https://transmart.qq.com/ 软件

Creating custom and compound Views in Android - Tutorial(翻译)

Creating custom and compound Views in Android - Tutorial(翻译) 译前的: 之前做了三篇学习笔记,从知乎上面看到了这篇英文的推荐,总的来说可以是一篇导读,没有相关的学习,看这篇,可以作为一个学习脉络导向;有相关的学习底子,可以作为一个基础夯实、思维理清。没想到一翻译就是四个多小时…英语渣,很多词句都不太准确,幸好有之前的学习基础打底…

vue dist文件打开index.html报Failed to load resource: net::ERR_FILE_NOT_FOUND

本地正常。打包好的dist文件打开index.html报Failed to load resource: net::ERR_FILE_NOT_FOUND 解决办法: 在webpack.prod.conf.js 中output添加参数publicPath:’./’ 在webpack.base.conf.js里 publicPath: process.env.NODE_ENV === ‘pro

github 报错 git fatal: unable to write new index file

错误一:git fatal: unable to write new index file主要原因就是服务器磁盘空间不够导致的,增加服务器空间就OK了在百度上面搜索没得到什么有效信息,在gooogle上搜索得到很多有效信息 Finding large directories with something like the following helped clean up some log fi

Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接

在进行参数化读取时发现一个问题: 发现问题: requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8081): Max retries exceeded with url: /jwshoplogin/user/update_information.do (Caused by NewConn

c.toString() 和 String s = new String(c) 区别

String str = "abcd";char [] c = str.toCharArray();String s = new String(c);String s2 = c.toString();其中s和s2有什么区别???String str = "abcd";char [] c = str.toCharArray();String s = new String(c); //

获取时间戳是使用System.currentTimeMillis()还是使用new Date().getTime()(阿里开发规范)?

1.阿里规范 在阿里的Java开发手册中强制要求使用System.currentTimeMillis() 2.为什么(源码详解) new Date().getTime()它实际上也是调用的System.currentTimeMillis(),源码分析。 这个fastTime是它的成员变量,在new Date()的时候就被赋值了。 扩展一下这个transient这个关键字,它是为了保护