• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > CFileDialog的钩子函数解决对话框的多选之DoModal问题

CFileDialog的钩子函数解决对话框的多选之DoModal问题

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了cfiledialog domodal,cfiledialog,cfiledialog打开文件,cfiledialog dlg,cfiledialog保存文件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前几天领导问我一个问题:就是使用CFileDialog类在设置多选时选中的文件所放的文件缓冲区不知设置多大合适,设置小了DoModal返回为失败, 通过CommDlgExtendedError函数获取错误码为FNERR_BUFFERTOOSMALL(即缓冲区太小),设置大了又浪费内存。(我们 一次要选几百个文件,实在不知设置多大合适)。

      我谈了我的思路:CFileDialog的数据成员m_ofn有一个数据成员为钩子函数指针,通过设置这个函数,可以勾取CFileDialog的相关消 息,比如用户改变路径的消息,然后获取当前路径的文件个数,以此为依据来设置缓冲区的大小。领导不是很明白我的思路,他上网搜了搜,找到一种方法,就是通过派生CFileDialog类的方法来做,具体如下:

     Multiple Selection in a File Dialog

    上面的链接提到的方法确实可行。但是我也相信我的方法是可行的。下班后我上网搜索了一下,发现微软官网上有一个对此问题的解决办法,链接如下:

如何处理在 Windows 中 FNERR_BUFFERTOOSMALL 

     该链接提供的代码适合的是Win 32的程序,并不适合MFC的程序,而且我建了一个Win32的程序测试该例子的代码时,发现一个问题,就是当选择的文件过多时,就是需要分配的缓冲区比较多时,使用链接中的HeapAlloc函数会出现错误,错误提示如下:

 

     因此要将链接中分配内存和释放的内存的HeapAlloc和HeapFree函数分别用C++的new和delete操作符替换。

      在微软官网提供的做法的基础上我摸索出用在MFC程序的做法,具体代码如下:

    另外使用钩子函数的一个严重缺点是程序必须使用Unicode字符集进行编译,使用多字节字符集编译程序执行后FNERR_BUFFERTOOSMALL的错误(这一点已经测试过,我比较难以理解的是为何在这一点上微软不予支持多字节程序)。我的测试环境为: VS C++ 2005 + sp1,Win XP + sp3,unicode字符集。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • CFileDialog的钩子函数解决对话框的多选之DoModal问题

相关文章

  • 2017-05-28实例解析C++设计模式编程中简单工厂模式的采用
  • 2017-05-28如何在二叉树中找出和为某一值的所有路径
  • 2017-05-28深入遍历二叉树的各种操作详解(非递归遍历)
  • 2017-05-28详解socket阻塞与非阻塞,同步与异步、I/O模型
  • 2017-05-28C++之WSAAsyncSelect模型实例
  • 2017-05-28C语言基础 原码、反码、补码和移码详解
  • 2017-05-28C/C++中可变参数的用法详细解析
  • 2017-05-28数据结构之堆详解
  • 2017-05-28深入理解C++的动态绑定与静态绑定的应用详解
  • 2017-05-28C++检查某个文件或目录是否存在的函数

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • error LNK2019: 无法解析的外部符号 问题的解决办法
    • C++使用一个栈实现另一个栈的排序算法示例
    • 详解C++中如何将构造函数或析构函数的访问权限定为private
    • 使用C语言求二叉树结点的最低公共祖先的方法
    • C语言借助EasyX实现的生命游戏源码
    • 对C++默认构造函数的一点重要说明
    • C++多线程编程时的数据保护
    • C语言 扩展欧几里得算法代码
    • VC中SendMessage和PostMessage的区别
    • C++ 继承详解及实例代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有