为MinDate属性指定了一个大于MaxDate当前值的值

来源:互联网 发布:伊利莎白女伯爵 知乎 编辑:程序博客网 时间:2024/05/22 20:29

    单位一应用软件,在一台电脑上运行某功能时提示“为MinDate属性指定了一个大于MaxDate当前值的值”,在其它电脑使用都正常。

    经查询发现“为MinDate属性指定了一个大于MaxDate当前值的值” 提示是微软DTPicker控件的提示。表示为该控件MinDate属性设置值时大于了该控件MaxDate设置的值。

    观察正常电脑上的情况,该控件MinDate会设置为从数据库中取出的一个值,MaxDate会设置为当前时间。

    为啥就这台电脑会出错呢?没有思路直接重装机器,我晕,还是同样故障。

   根据 https://support.microsoft.com/zh-cn/kb/198880内容发现设置这两个属性时会调用SendMessage给该控件发送消息。

 


    上windbg调试器,设置断点:

    bp User32!SendMessageA ".if(poi(esp+8) == 0x00001004) {} .else {gc}"

    表示当调用SendMessageA函数并且第二个参数(消息类型)是0x00001004(DTM_SETRANGE消息)时中断,否则继续执行。

跟踪到一个结果如下:


可以看到第一个参数00050a50表示控件的hwnd,第二个参数00001004表示消息,第三个参数00000003表示同时设置mindate和maxdate,第四个参数0012d700是SYSTEMTIME结构数组地址。
0012d700地址行正好是mindate所有参数,00010641表示年月(interger类型为16位),0641表示1601年,0001表示1月,
0012d710地址行正好是maxdate所有参数,000707df表示年月(interger类型为16位),07df  表示2015年,0007表示7月,000d0001中的000d表示日13号。

等等,不对呀,今天应该是23号的。
在看系统时间,完了,果然是2015年7月13日。这就对了,前面说过“该控件MinDate会设置为从数据库中取出的一个值,MaxDate会设置为当前时间",
数据库中记录的值一定小于当前时间。系统时间设置过小了直接导致小于数据库中的时间。因此出错了。
本来以为当前时间会从数据库中取的,结果是这样。

0 0
原创粉丝点击