翻译《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.mzph.cn/diannao/20105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python | 类的实现

和实例有关的&#xff0c;通过对象名&#xff0c;打点调用 实例属性&#xff0c;实例方法 stuStudent("XiaoMing",18) print(stu.name) 类属性、静态方法和类方法都是通过类名直接调用 Student.name 静态方法和类方法都不能调用实例属性和实例方法 动态绑定 如果是函…

稳定性问题ANR-input

专栏简介 接上文【Android ANR简介】内容,深入探索input 类型的ANR问题产生原理,至于解决此类ANR的进阶内容会在下篇【稳定性问题ANR-input进阶】中详细介绍。 input ANR简介 Android app的input事件都是有主线程消费的,假设主线程有耗时函数执行,就会产生ANR问题;但是…

深入分析 Android Service (四)

文章目录 深入分析 Android Service (四)1. 使用 Messenger 进行通信2. 详细示例&#xff1a;使用 Messenger 进行通信2.1 创建 MessengerService2.2 在 Activity 中绑定服务并发送消息 3. 使用 AIDL 进行进程间通信3.1 定义 AIDL 接口3.2 实现 AIDL 接口3.3 在客户端绑定 AIDL…

C语言序列化和反序列化--TPL中的API(三)

tpl_map 创建tpl的唯一方法是调用tpl_map()。第一个参数是格式字符串。后面是格式字符串中特定字符所需的参数列表。例如, tpl_node *tn; int i; tn tpl_map( "A(i)", &i );该函数在格式字符串中的项和给定地址的C程序变量之间创建映射。稍后&#xff0c;C变量…

Apache Doris 基础 -- 数据表设计(分区分桶)

Versions: 2.1 本文档主要介绍了Doris的表创建和数据分区&#xff0c;以及表创建过程中可能遇到的问题和解决方案。 1、基本概念 在Doris中&#xff0c;数据以表的形式被逻辑地描述。 1.1 Row & Column 表由行和列组成: 行:表示用户数据的单行;列:用于描述一行数据中的…

自定义对象池BasePooledObjectFactory的使用

项目中用到了apache的对象池来管理文件导出相关资源连接和回收功能&#xff0c;因此花点时间简单了解下对象池相关使用&#xff0c;做点记录。 一. 连接池 频繁的建立和关闭连接&#xff0c;会极大的降低系统的性能&#xff0c;而连接池会在初始化的时候会创建一定数量的连接…

C++ | Leetcode C++题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 max(buy1, -prices[i]);sell1 max(…

OceanBase v4.2 特性解析:新增三种临时表功能,更多的Oracle语句兼容

特性说明 在Oracle模式下&#xff0c;OceanBase临时表已经实现了基本的create、select、insert、delete、update等功能。为了满足更多客户的需求&#xff0c;OceanBase正在扩展临时表的功能&#xff0c;例如支持merge into和insert all操作。merge into允许用户将源表中的数据…

FPGA高端项目:FPGA解码MIPI视频+图像缩放+视频拼接,基于MIPI CSI-2 RX Subsystem架构实现,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案本方案在Xilinx Artix7-35T上解码MIPI视频的应用本方案在Xilinx Artix7-100T上解码MIPI视频的应用本方案在Xilinx Kintex7上解码MIPI视频的应用本方案在Xilinx Zynq7000上解码MIPI视频的应用本方案在…

Linux基础命令目录管理002

之前讲述了目录的创建和删除&#xff0c;现在讲一下目录的移动修改。 操作系统&#xff1a; CentOS Stream 9 操作命令&#xff1a; mv 移动&#xff0c;重命名 选项 -v显示移动过程 [rootlocalhost ~]# mkdir 12 [rootlocalhost ~]# ll 总用量 1220 drwxr-xr-x 2 root…

11.1 排序算法

目录 11.1 排序算法 11.1.1 评价维度 11.1.2 理想排序算法 11.1 排序算法 排序算法&#xff08;sorting algorithm&#xff09;用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更高效地查找、分析和处理。 如图 1…

WebSocket实现前后端双向数据的实时推送

一、WebSocket简介 WebSocket是一种网络通信协议&#xff0c;旨在实现客户端和服务器之间的双向、全双工通信。它在HTML5规范中被引入&#xff0c;用于替代基于传统HTTP协议的长轮询、轮询和流传输等方式&#xff0c;以提供更高效的实时数据传输。 WebSocket的特点 双向通信&a…

Python 3 判断文件是否存在

1 使用os.path模块 import osfile_path hello.txtif os.path.exists(file_path):print(f"文件 {file_path} 存在。") else:print(f"文件 {file_path} 不存在。") 2 使用pathlib模块 from pathlib import Pathfile_path Path(word.txt)if file_path.ex…

32-ESP32-S3-WIFI篇-03 Event Loop (事件循环)

ESP32-S3-WIFI 事件循环 介绍 在ESP32-S3的WiFi驱动程序中&#xff0c;事件循环是一个非常重要的概念。事件循环是一个无限循环&#xff0c;用于处理和分发系统中发生的各种事件。在WiFi驱动程序中&#xff0c;我们使用事件循环来处理和分发WiFi相关的事件。 创建事件循环 …

PTA 7-10 构造二叉检索树

本题目构造一棵二叉检索树。要求读入n个整数&#xff0c;以0结束。最后输出这棵树的先序序列。 输入格式: 输入n个整数&#xff0c;以0表示结束&#xff0c;数据间以空格隔开。 输出格式: 输出这棵树的先序序列&#xff0c;以一个空格隔开&#xff0c;结尾也有一个空格。 …

常用电机测试方法的介绍与功能实现(M测试方法)

目录 概述 1 常用电机测速方法简介 1.1 方法概览 1.2 编码器测速方法 2 M法测速 2.1 理论描述 2.2 实现原理 2.3 速度计算方法 3 功能实现 3.1 功能介绍 3.2 代码实现 3.2.1 使用STM32Cube配置参数 3.2.2 脉冲计数功能 3.2.3 测速函数 4 测试 概述 本文主要介绍…

springboot针对返回的response拦截处理越权问题

背景&#xff1a;针对越权测试&#xff0c;通过拦截工具Fiddler修改请求参数&#xff0c;越权查看平台里面所有公司的数据 1、自定义MyResponseBodyAdvice 实现ResponseBodyAdvice 使用过滤器和拦截我都试过&#xff0c;最终没有成功&#xff0c;可能技术比较菜&#xff0c;这…

策略模式解析

import java.util.*; enum TYPE { NORMAL,CASH_DISCOUNT,CASH_RETURN}; interface Cashsuper { public double acceptCash(double money); } class CashNormal implements CashSuper{// 正常收费子类 public double accptCash(double money){ return money; …

C# Winform 已知窗体句柄,如何遍历出所有控件句柄

c# windform 已知窗体句柄&#xff0c;如何遍历出所有控件句柄 public delegate bool CallBack(int hwnd, int lParam);public delegate bool EnumWindowsProc(int hWnd, int lParam); List<string> list new List<string>();[DllImport("user32.dll")]…

通过MySQL JSON函数实现对GSON字段属性的搜索和筛选

在 MySQL 中直接对 Gson 格式的字段进行搜索是有一定的限制的&#xff0c;因为 MySQL 不支持直接解析和操作 JSON 或 Gson 数据。不过你可以使用一些函数来模拟实现对 Gson 字段内部某个属性的搜索&#xff0c;比如使用 LIKE 来做模糊匹配。 假设你的表名为 gson_table&#x…