-
-
[原创]vista sp1下listview选择的一处bug
-
发表于: 2008-9-7 08:17 4345
-
sdk做了一个程序, 在一个对话框资源上放置一个listview, dialogbox
出对话框来,然后在listview里面追加一些items, 这时选择一行item,
系统会给予ding.wav的提示声。
记得系统的listview, 比如桌面, 比如文件夹内文件的详细排列信息,
都不会有提示声, 更重要的是, MFC的对话框里面放置的listview也没有声音。
百思不得其解, baidu google也得不到答案, 于是debug后发现是comctl32
的一个bug, 具体表现在:
comctl32.dll!_CCPlaySound@4 这个函数里面, 伪代码描述如下
comctl32.dll file version 5.82(vista_rtm.061101-2205)
char buf[280];
DWORD retsize = 280;
if (ERROR_SUCCESS == RegQueryValue(HKEY_CURRENT_USER, "AppEvents\Schemes\Apps\.Default\CCSelect\.current", buf, &retsize))
{
LoadLibrary("wimm.dll");
GetProcAddress("waveOutGetNumDevs");
GetProcAddress("PlaySoundW");
call function waveOutGetNumDevs;
call function PlaySoundW(buf, 0, 1);
}
当电脑上存在AppEvents\Schemes\Apps\.Default\CCSelect\.current键值的时候,
并且默认值被删除的情况下, RegQueryValue会返回ERROR_SUCCESS, 并且retsize=0,
buf的内容不做改变。
这时如果buf的内容无效调用PlaySound则会导致一个错误, 于是系统给予ding.wav的声音。
当如果恰巧buf本身就是0,0开头的unicode串, 那么则不会有任何反应。 MFC的程序恰巧碰到这一点。
也就是说上面的条件需要改成
if (ERROR_SUCCESS == RegQueryValue(HKEY_CURRENT_USER, "AppEvents\Schemes\Apps\.Default\CCSelect\.current", buf, &retsize)
&& retsize != 0)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]第二阶段第一题提交 2847
- [原创]第一阶段第四题提交 3622
- [原创]第一阶段第三题提交 3261
- [原创]第一阶段第二题提交 3906
- [原创]第一阶段第一题提交 2941