首页
论坛
专栏
课程

[原创]vista sp1下listview选择的一处bug

2008-9-7 08:17 2681

[原创]vista sp1下listview选择的一处bug

2008-9-7 08:17
2681
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)

[公告][征集寄语] 看雪20周年年会 | 感恩有你,一路同行

最新回复 (0)
游客
登录 | 注册 方可回帖
返回