在我们的程序中有时候需要一次选择多个文件,例如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

留言反馈
RegisterWindow(&wc); //注册窗口类
这个对象注册到了什么地方??
--------------------------------------------------------------------------------------
能不能稍微指点一下,《windows程序设计》书上第3章的那个HELLOWIN的程序,是有1个进程和1个应用程序组成的,那么我在任务管理器中看到的应用程序名字,比如说:“某某人的窗口”字样的内容是不是就是这个进程的主线程??
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
我知道AfxGetApp()返回的是一个CWinApp* 类型的指针,
但是这句话和《windows程序设计》书上的
wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
怎么等价过去??
shanzy1980@hotmail.com
是否能够通过InstallShield建立asp.net安装程序?