jiangsheng

http://www.csdn.net/develop/author/netauthor/jiangsheng/
随笔 - 140, 评论 - 623, 引用 - 27

导航

关于

这下要维护3个BLOG了,faint 其他的地址:

所有的文章版权归原文作者所有,任何人需要转载文章,必须征得原文作者授权。
我的MVP配置

标签

每月存档

最新留言

广告

 

在我们的程序中有时候需要一次选择多个文件,例如InstallShield的安装程序向导中的一个步骤就是为feature选择文件;但是在选择的文件过多(超过30个)的时候,这样的选择没有效果。我不得不在InstallShield的文件打开对话框中切换到小图标模式,并且一次选择两列的文件(很久之前就不得不用Linked Directory来动态链接整个目录中的文件了,不知道新的InstallShield版本改进没有)。

这种情况是因为默认的缓冲区只有两百多个字符。如果缓冲区不够长,那么调用对话框可能会失败,CommDlgExtendedError()会返回FNERR_BUFFERTOOSMALL。为了解决这个问题,你可以处理CDN_SELCHANGE来在选择项数目变化的时候动态重新分配缓冲区(参见http://support.microsoft.com/kb/131462/)或者在创建对话框的时候把缓冲区设大一点:

但是尽管提供了这么长的缓冲区(我是使用ANSI配置编译的,所以缓冲区有26M,足足可以容纳10万个文件名),但是结果还是没有获得全部文件名,这是因为GetOpenFileName限制了复制到缓冲区中的文件名的总长度(http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxfunctions/getopenfilename.asp)

OK,在文档中我看到了解决方案之一是使用UNICODE版本的函数GetOpenFileNameW,但是在Windows 9x上似乎只能用ANSI版本的函数。难道我要编写Windows版本检查代码来调用不同版本的函数?

这是推荐的作法。但是程序员是很懒的,所以有时候我会使用一些非官方方法。在我以前的一篇BLOG(http://blog.joycode.com/jiangsheng/archive/2004/09/17/33756.aspx)中我提到了如何访问文件打开对话框的IShellBrowser接口。通过这个接口我们可以访问文件打开对话框的IShellView接口,进而获得选中的文件(为节省篇幅,ILIsFile、GetPIDLFolder、GetPIDLItem和WM_GETISHELLBROWSER的定义就不重复了):

然后如下使用

调试输出是

Selected 2415 Files(和资源管理器的报告相符)
GetOpenFileName returned 2378 Files(……)

打印 | 张贴于 2004-11-22 04:00:00 | Tag:用户界面  平台SDK(Platform SDK)  类库(Library)  CSDN

留言反馈

#re: OK,I will give up WM_USER 7 ...sooner or later 编辑
2006-07-03 06:17:00 | [匿名用户:jiangsheng]
#横秋扫盲系列(2): CFileDialog 文件对话框 -- 2005-8-14 17:22:32 编辑
Ping Back来自:blog.csdn.net
2005-09-01 13:59:00 | [匿名用户:vcmute]
#re: 打开大量文件 编辑
算了,自己想明白了
2005-05-19 09:18:00 | [匿名用户:tudou614]
#re: 打开大量文件 编辑
大哥,能讲解一下吗??
2005-05-17 05:29:00 | [匿名用户:tudou614]
#re: 打开大量文件 编辑
诶,老大没看到吗??
2005-05-16 01:05:00 | [匿名用户:tudou614]
#re: 打开大量文件 编辑
再问大侠2个问题:

RegisterWindow(&wc); //注册窗口类

这个对象注册到了什么地方??

--------------------------------------------------------------------------------------
能不能稍微指点一下,《windows程序设计》书上第3章的那个HELLOWIN的程序,是有1个进程和1个应用程序组成的,那么我在任务管理器中看到的应用程序名字,比如说:“某某人的窗口”字样的内容是不是就是这个进程的主线程??
2005-05-15 12:48:00 | [匿名用户:tudou614]
#re: 打开大量文件 编辑
问个问题:

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

我知道AfxGetApp()返回的是一个CWinApp* 类型的指针,

但是这句话和《windows程序设计》书上的

wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);

怎么等价过去??

shanzy1980@hotmail.com
2005-05-15 12:32:00 | [匿名用户:tudou614]
#re: Better Late Than Never 编辑
2004-11-30 23:57:00 | [匿名用户:jiangsheng]
#re: 打开大量文件 编辑
我手头这个版本是asp.net之前出来的,肯定不支持asp.net
2004-11-24 12:27:00 | [匿名用户:jiangsheng]
#re: 打开大量文件 编辑
问点题外话:
是否能够通过InstallShield建立asp.net安装程序?
2004-11-22 09:18:00 | [匿名用户:bestcomy]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.8