Microsoft.Win32.CommonDialog问题

iamcaicainiao 2008-09-17 01:53:33
FileDialog继承自Microsoft.Win32.CommonDialog

自定义一个class A继承自FileDialog

A a = new A();

调用a.ShowDialog();
输入c:aaaaa.txt,注意,此时缺少了一个反斜杠“\”,正确输入应该是c:\aaaaa.txt

在VISTA下面,弹出消息框“The file name is not valid”
而在xp下面,却没有这个消息框弹出,之后就crash掉了。因为有个DLL要调用这个路径,这个路径根本就不对,所以CRASH了。

请问有何办法使之在XP下面也进行同样的检查?或者说为什么xp没有检查?
或者,在抛出异常之后,处理异常?个人认为这是下策。
...全文
126 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamcaicainiao 2008-09-17
  • 打赏
  • 举报
回复
设置
CheckPathExists

CheckFileExists

ValidateNames
都为 TRUE,

这样,当我输入c:aaa.txt,他应该warning啊,怎么没有效果呢?
iamcaicainiao 2008-09-17
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-us/library/microsoft.win32.filedialog.aspx

Inheritance Hierarchy
System.Object
Microsoft.Win32.CommonDialog
Microsoft.Win32.FileDialog
Microsoft.Win32.OpenFileDialog
Microsoft.Win32.SaveFileDialog

所以,这个应该是类库,而不是“实现代码在别的类里”,你觉得呢?
iamcaicainiao 2008-09-17
  • 打赏
  • 举报
回复
MSDN

Inheritance Hierarchy
System..::.Object
Microsoft.Win32..::.CommonDialog
Microsoft.Win32..::.FileDialog
Microsoft.Win32..::.OpenFileDialog
ZengHD 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 iamcaicainiao 的回复:]
我觉得这个应该也不是自定义的吧?否则怎么见不到那些函数的源代码?

我觉得这个应该是.net类库里的函数。

我刚刚试了设置CheckPathExists和CheckFileExists和ValidateNames都为 TRUE,还是不行。
[/Quote]

我看到abstract 和 virtual 了,实现的代码在别的类里
iamcaicainiao 2008-09-17
  • 打赏
  • 举报
回复
我觉得这个应该也不是自定义的吧?否则怎么见不到那些函数的源代码?

我觉得这个应该是.net类库里的函数。

我刚刚试了设置CheckPathExists和CheckFileExists和ValidateNames都为 TRUE,还是不行。
ZengHD 2008-09-17
  • 打赏
  • 举报
回复
namespace Microsoft.Win32
搞错了
我以为是VB6那个CommonDialog呢

原来是自定义的命名空单和对话框
iamcaicainiao 2008-09-17
  • 打赏
  • 举报
回复
下面这个是在metadata文件里看到的类CommonDialog。

其他几个类FileDialog和OpenFileDialog文件也差不多这个样子。

这个应该不是CommonDialog控件吧?

using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Windows;

namespace Microsoft.Win32
{
public abstract class CommonDialog
{
protected CommonDialog();

public object Tag { get; set; }

protected virtual void CheckPermissionsToShowDialog();

[SecurityCritical]
protected virtual IntPtr HookProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam);

[SecurityCritical]
public abstract void Reset();

protected abstract bool RunDialog(IntPtr hwndOwner);

[SecurityCritical]
public virtual bool? ShowDialog();

[SecurityCritical]
public bool? ShowDialog(Window owner);
}
}
ZengHD 2008-09-17
  • 打赏
  • 举报
回复
你不是使用Microsoft.Win32.CommonDialog这个组件吗?
怎么会没有属性呢
iamcaicainiao 2008-09-17
  • 打赏
  • 举报
回复
莫非我这个CLASS跟你说的来源不一样?

我这个对象并没有flag属性可以设置,因此也无法设置你上面列出的那些属性。
ZengHD 2008-09-17
  • 打赏
  • 举报
回复
cdlOFNAllowMultiselect &H200 它指定文件名列表框允许多重选择。
运行时,通过按 SHIFT 键以及使用 UP ARROW 和 DOWN ARROW 键可选择多个文件。作完此操作后,FileName 属性就返回一个包含全部所选文件名的字符串。串中各文件名用空格隔开。
cdlOFNCreatePrompt &H2000 当文件不存在时对话框要提示创建文件。该标志自动设置 cdlOFNPathMustExist 和 cdlOFNFileMustExist 标志。
cdlOFNExplorer &H80000 它使用类似资源管理器的打开一个文件的对话框模板。适用于 Windows 95 和 Windows NT 4.0。
CdlOFNExtensionDifferent &H400 它指示返回的文件扩展名与 DefaultExt 属性指定的扩展名不一致。如果 DefaultExt 属性是 Null,或者扩展相匹配,或者没有扩展时,此标志不设置。当关闭对话框时,可以检查这个标志的值。
cdlOFNFileMustExist &H1000 它指定只能输入文件名文本框已经存在的文件名。如果该标志被设置,则当用户输入非法的文件名时,要显示一个警告。该标志自动设置 cdlOFNPathMustExist 标志。
cdlOFNHelpButton &H10 使对话框显示帮助按钮。
cdlOFNHideReadOnly &H4 隐藏只读复选框。
cdlOFNLongNames &H200000 使用长文件名。
cdlOFNNoChangeDir &H8 强制对话框将对话框打开时的目录置成当前目录。
CdlOFNNoDereferenceLinks &H100000 不要间接引用外壳链接(也称作快捷方式)。缺省时,选取外壳链接会引起它被外壳间接引用。
cdlOFNNoLongNames &H40000 无长文件名。
CdlOFNNoReadOnlyReturn &H8000 它指定返回的文件不能具有只读属性,也不能在写保护目录下面。
cdlOFNNoValidate &H100 它指定公共对话框允许返回的文件名中含有非法字符。
cdlOFNOverwritePrompt &H2 使“另存为”对话框当选择的文件已经存在时应产生一个信息框,用户必须确认是否覆盖该文件。
cdlOFNPathMustExist &H800 它指定只能输入有效路径。如果设置该标志,输入非法路径时,应显示一个警告信息。
cdlOFNReadOnly &H1 建立对话框时,只读复选框初始化为选定。该标志也指示对话框关闭时只读复选框的状态。
cdlOFNShareAware &H4000 它指定忽略共享冲突错误。
iamcaicainiao 2008-09-17
  • 打赏
  • 举报
回复
我的这里只能通过 metadata 看到class的函数名等。

显示的他们都是Microsoft.Win32命名空间下面的。

最初是一个抽象类 CommonDialog

他的子类是另外一个抽象类 FileDialog

FileDialog的子类是一个sealed 类,OpenFileDialog

最终使用这些类的代码,是用OpenFileDialog定义一个对象,调用对象的ShowDialog方法。

我在vista下输入c:aaa.txt,弹出消息框,提示文件名不合法,但在xp下面,就直接crash了。
ZengHD 2008-09-17
  • 打赏
  • 举报
回复
OpenFileDialog是.NET的类库
CommonDialog是一个COM组件或者Activex

很不相同啊
iamcaicainiao 2008-09-17
  • 打赏
  • 举报
回复
确切的说,应该就是使用的是OpenFileDialog.

OpenFileDialog继承自FileDialog。
FileDialog继承自CommonDialog

最终,是用OpenFileDialog定义了一个对象。另外,这个是一个老项目,不便大修改,大动作,只好修修补补。
ZengHD 2008-09-17
  • 打赏
  • 举报
回复
使用OpenFileDialog 或者 SaveFileDialog
ZengHD 2008-09-17
  • 打赏
  • 举报
回复
为什么还要用这个?
在VB6都不推荐使用CommonDialog
在.NET里更不要使用了

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧