SINK_ENTRY_EX

时间: 2023-11-21 21:58:14 浏览: 22
SINK_ENTRY_EX是ATL中的一个宏,用于将事件处理程序添加到事件源的连接点容器中。它的语法如下: ```cpp SINK_ENTRY_EX( nID, uuid, nDispid, fn ); ``` 其中,nID是连接点容器的标识符,uuid是事件源的接口标识符,nDispid是事件的标识符,fn是事件处理程序的名称。SINK_ENTRY_EX宏会生成一个结构体,该结构体包含了事件处理程序的信息,并将其添加到连接点容器中。 举个例子,假设我们有一个名为CFun1的类,它实现了一个名为_IFun1Events的事件源接口,其中包含一个名为OnNotify的事件。我们可以使用SINK_ENTRY_EX宏将事件处理程序添加到连接点容器中,如下所示: ```cpp class CFun1 : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CFun1, &CLSID_Fun1>, public IDispatchImpl<IFun1, &IID_IFun1, &LIBID_AtlEventServerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>, public IConnectionPointContainerImpl<CFun1>, public CProxy_IFun1Events<CFun1>, public IObjectWithSiteImpl<CFun1>, public IProvideClassInfo2Impl<&CLSID_Fun1, &DIID__IFun1Events, &LIBID_AtlEventServerLib>, public CProxy_IAxWinAmbientDispatch<CFun1>, public IDispEventImpl<1, CFun1, &DIID__IFun1Events, &LIBID_AtlEventServerLib, /*wMajor =*/ 1, /*wMinor =*/ 0> { public: // ... BEGIN_SINK_MAP(CFun1) SINK_ENTRY_EX(0, __uuidof(_IFun1Events), 1, OnNotify) END_SINK_MAP() // ... }; ``` 这样,当事件源触发OnNotify事件时,CFun1类的OnNotify方法就会被调用。

相关推荐

下面是分割和合并文件的Java代码实现: 分割文件: java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileSplitter { public static void main(String[] args) { String sourceFilePath = "D:/source_dir/source_file.mp4"; // 被分割的大文件路径 int blockSize = 100 * 1024 * 1024; // 分割块大小,单位MB String targetDirPath = "D:/sink_dir"; // 分割后小文件存放的目录路径 File sourceFile = new File(sourceFilePath); if (!sourceFile.exists() || !sourceFile.isFile()) { System.err.println("源文件不存在或不是一个文件!"); return; } File targetDir = new File(targetDirPath); if (!targetDir.exists()) { targetDir.mkdirs(); } try (FileInputStream fis = new FileInputStream(sourceFile); FileChannel sourceChannel = fis.getChannel()) { ByteBuffer buffer = ByteBuffer.allocate(blockSize); int index = 0; while (sourceChannel.read(buffer) != -1) { buffer.flip(); File targetFile = new File(targetDir, index + ".part"); try (FileOutputStream fos = new FileOutputStream(targetFile); FileChannel targetChannel = fos.getChannel()) { targetChannel.write(buffer); } buffer.clear(); index++; } System.out.println("文件分割成功,共分割成 " + index + " 个文件!"); } catch (IOException e) { e.printStackTrace(); } } } 合并文件: java import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.Arrays; import java.util.Comparator; public class FileMerger { public static void main(String[] args) { String sourceDirPath = "D:/sink_dir"; // 小文件存放的目录路径 String targetFilePath = "D:/source_dir/source_file_merge.mp4"; // 合并后文件的路径 File sourceDir = new File(sourceDirPath); if (!sourceDir.exists() || !sourceDir.isDirectory()) { System.err.println("源目录不存在或不是一个目录!"); return; } File[] files = sourceDir.listFiles(); if (files == null || files.length == 0) { System.err.println("源目录中没有找到任何文件!"); return; } Arrays.sort(files, Comparator.comparing(File::getName)); // 按文件名排序 try (FileOutputStream fos = new FileOutputStream(targetFilePath); FileChannel targetChannel = fos.getChannel()) { ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); for (File file : files) { try (FileInputStream fis = new FileInputStream(file); FileChannel sourceChannel = fis.getChannel()) { while (sourceChannel.read(buffer) != -1) { buffer.flip(); targetChannel.write(buffer); buffer.clear(); } } } System.out.println("文件合并成功,合并后文件路径为:" + targetFilePath); } catch (IOException e) { e.printStackTrace(); } } } 需要注意的是,这里使用的是Java NIO的FileChannel来实现文件的分割和合并,相比于传统的IO流,NIO的效率更高,可以提高文件的读写速度。同时,分割和合并文件的代码实现中,还需要注意一些异常情况的处理,例如源文件或目录不存在等。

最新推荐

0690、断线检测式报警电路.rar

0689、短路检测式报警电路.rar

全国34个省份2000-2021高技术产业投资-施工项目数.xlsx

数据年度2000-2021 数据范围:全国34个省份,含港澳台 数据年度:2000-2021,22个年度的数据 excel数据文件包原始数据(由于多年度指标不同存在缺失值)、线性插值、ARIMA填补三个版本,提供您参考使用。 其中,ARIMA回归填补无缺失值。 填补说明: 线性插值。利用数据的线性趋势,对各年份中间的缺失部分进行填充,得到线性插值版数据,这也是学者最常用的插值方式。 ARIMA回归填补。基于ARIMA模型,利用同一地区的时间序列数据,对缺失值进行预测填补。

ssm数据结构课程网络学习平台的+vue毕业论文.doc

ssm数据结构课程网络学习平台的+vue毕业论文.doc

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

Objective-C中的协议与代理设计模式介绍

# 1. 理解Objective-C中的协议 协议是Objective-C中一种很重要的特性,它类似于其他编程语言中的接口,用来定义对象之间的通信规则和行为约定。在Objective-C中,协议可以帮助实现对象之间的松耦合和重用性。让我们深入了解Objective-C中的协议。 ## 1.1 什么是Objective-C中的协议? 在Objective-C中,协议是一组方法的声明,定义了一个对象可以遵循的接口。协议本身并不实现任何方法,而是规定遵循该协议的类需要实现协议中定义的方法。通过协议,可以在不同的类之间定义一组公共的行为和方法。 ## 1.2 协议的声明和使用方法 在Ob

编写求n!的函数f(int n),在主函数中输入两个整数m、n,然后调用函数求: C=m!/n!(m -n)!

好的,我可以编写这个函数。以下是代码示例: ```c++ #include <iostream> using namespace std; int f(int n) { if (n <= 1) { return 1; } else { return n * f(n - 1); } } int main() { int m, n; cout << "请输入两个整数m和n,以空格分隔:" << endl; cin >> m >> n; int C = f(m) / (f(n) * f(m - n));

视频中运动目标跟踪算法的研究.doc

视频中运动目标跟踪算法的研究.doc

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依

Objective-C中的推送通知与APNs实现

# 1. 推送通知简介 推送通知是移动应用开发中常用的一种技术,它可以向用户发送消息、提醒或通知,即使用户并未在使用应用时也能及时获取重要信息。在Objective-C中,实现推送通知需要使用苹果提供的苹果推送通知服务(APNs)。本章将介绍推送通知的基础知识,包括推送通知的概念、作用和原理。接下来我们将深入了解。 ### 1.1 什么是推送通知 推送通知是通过网络将消息发送到设备的一种技术。应用程序可以向设备发送推送通知,无论用户当前是否在使用该应用,都可以及时获取到消息或通知。用户收到推送通知后,可以通过通知中的内容了解到消息的来源和内容,以便及时处理。 ### 1.2 推送通知的

php中,跳转语句有break和contimue

其实,`break`和`continue`并不是跳转语句,它们是用于控制循环语句的关键字。 `break`用于中断循环,跳出当前循环结构(如`for`、`while`、`do-while`),执行循环结构后面的语句。如果`break`语句后面跟着一个数字n,则表示跳出第n层循环。例如: ``` for ($i = 0; $i < 10; $i++) { for ($j = 0; $j < 10; $j++) { if ($j == 5) { break 2; // 跳出两层循环 } } } ``` `continue