GetOpenFileName/GetSaveFileName之Crash和pdfshell.dll
2009-09-15 16:29
525 查看
说CFileDialog有bug,先看一个现象吧:我用的是英文XP,[山丘之王]
用的是中文XP,[流川]
用的是2003
1. 打开windows自带的记事本程序
2. 菜单中选择save as,顺便输入一个名字,比如test.txt,点保存
3. 菜单中选择save as,把鼠标移到test.txt上(不是编辑框里面的test.txt,而是文件list里面的test.txt)
4. 此时整个进程crash掉,如果没有的话,重复第2步(提示:如果鼠标移动速度慢一些,基本上100%crash)
然后我用代码测试,再测试,……,发现不是MFC CFileDialog的问题,而是API GetSaveFileName的问题,代码如下:
void Capp32Dlg::OnBnClickedButton1()
{
TCHAR m_szFileName[_MAX_PATH] = _T("");
TCHAR m_szFileTitle[64] = _T("");
OPENFILENAME a = { sizeof(OPENFILENAME)
, this->m_hWnd
, (HINSTANCE)0x00400000
, 0
, 0
, 0
, 0
, m_szFileName
, _MAX_PATH
, m_szFileTitle
, 64
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0 };
GetSaveFileName( &a );
//CFileDialog dlg( FALSE );
//dlg.DoModal();
}
在第二次(或第三次,或……)时,鼠标一旦移动到上次保存的文件上就crash。
跟综调用堆栈如下:
00ddf37c 7d6ffe56 000c6f18 000e65c0 00ddf3d0 SHELL32!CFSFolder::GetDetailsEx+0x43c
00ddfde8 7d6fff9a 00ddfe20 00ddfe68 7d6f95e5 SHELL32!CInfoTip::_GetInfoTipFromItem+0x169
00ddfdf4 7d6f95e5 000d5f20 00000008 00ddfe20 SHELL32!CInfoTip::GetInfoTip+0x1c
00ddfe68 7d5c208d 000e63a8 000e2ab0 000d75c0 SHELL32!CStatusBarAndInfoTipTask::RunInitRT+0xf5
00ddfe84 75ef1b9a 000e63a8 75ef1b18 75ef0000 SHELL32!CRunnableTask::Run+0x54
00ddfee0 77f49548 000d0da0 000d4b70 77f4952b browseui!CShellTaskScheduler_ThreadProc+0x111
00ddfef8 7c947545 000d4b70 7c99c3a0 000d59e8 SHLWAPI!ExecuteWorkItem+0x1d
00ddff40 7c947583 77f4952b 000d4b70 00000000 ntdll!RtlpWorkerCallout+0x70
00ddff60 7c947645 00000000 000d4b70 000d59e8 ntdll!RtlpExecuteWorkerRequest+0x1a
00ddff74 7c94761c 7c947569 00000000 000d4b70 ntdll!RtlpApcCallout+0x11
00ddffb4 7c80b683 00000000 0007de34 0007de34 ntdll!RtlpWorkerThread+0x87
00ddffec 00000000 7c930760 00000000 00000000 kernel32!BaseThreadStart+0x37
问题是这样的:
起初是CFileDialog 遇到异常退出的问题,如下两行代码测试:
CFileDialog dlg(true);
dlg.DoModal();
多次打开文件
的时候,第一次随便选择一个,第二次选择桌面的一个.txt文件,当鼠标移动到这个.txt文件(或者用键盘选择到)的时候,程序
就崩溃了,测试一下记事本,也是一样的情况。
后来跟踪了一下,发现是pdf
shell.dll模块引起的问题,我的环境是xp sp2+Adobe7,换成Adobe8.1.2仍然存在这个情况,但在2003系统
在没有问题。以上说的都是中文
版。
再讲一些细节:
pdfshell.dll并不在进程内存一直存在,当程序调用“打开文件”对话框的时候,他还没有插入进来,当选择一个文件,或者鼠标移动到一个文件,进程被插入
:/Program Files/Common Files/Adobe/Acrobat/ActiveX
路径下的pdfshell.dll和pdfshell.CHS
选定了文件点击“打开”按钮之后,pdfshell.dll卸载,只留下pdfshell.CHS
引发异常的时候,程序崩溃在shell32.dll,GetLastError的值是1008,ERROR_NO_TOKEN
笔者水平有限时间
有限,文章只做抛砖引玉,不当之处,欢迎讨论
用的是中文XP,[流川]
用的是2003
1. 打开windows自带的记事本程序
2. 菜单中选择save as,顺便输入一个名字,比如test.txt,点保存
3. 菜单中选择save as,把鼠标移到test.txt上(不是编辑框里面的test.txt,而是文件list里面的test.txt)
4. 此时整个进程crash掉,如果没有的话,重复第2步(提示:如果鼠标移动速度慢一些,基本上100%crash)
然后我用代码测试,再测试,……,发现不是MFC CFileDialog的问题,而是API GetSaveFileName的问题,代码如下:
void Capp32Dlg::OnBnClickedButton1()
{
TCHAR m_szFileName[_MAX_PATH] = _T("");
TCHAR m_szFileTitle[64] = _T("");
OPENFILENAME a = { sizeof(OPENFILENAME)
, this->m_hWnd
, (HINSTANCE)0x00400000
, 0
, 0
, 0
, 0
, m_szFileName
, _MAX_PATH
, m_szFileTitle
, 64
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0 };
GetSaveFileName( &a );
//CFileDialog dlg( FALSE );
//dlg.DoModal();
}
在第二次(或第三次,或……)时,鼠标一旦移动到上次保存的文件上就crash。
跟综调用堆栈如下:
00ddf37c 7d6ffe56 000c6f18 000e65c0 00ddf3d0 SHELL32!CFSFolder::GetDetailsEx+0x43c
00ddfde8 7d6fff9a 00ddfe20 00ddfe68 7d6f95e5 SHELL32!CInfoTip::_GetInfoTipFromItem+0x169
00ddfdf4 7d6f95e5 000d5f20 00000008 00ddfe20 SHELL32!CInfoTip::GetInfoTip+0x1c
00ddfe68 7d5c208d 000e63a8 000e2ab0 000d75c0 SHELL32!CStatusBarAndInfoTipTask::RunInitRT+0xf5
00ddfe84 75ef1b9a 000e63a8 75ef1b18 75ef0000 SHELL32!CRunnableTask::Run+0x54
00ddfee0 77f49548 000d0da0 000d4b70 77f4952b browseui!CShellTaskScheduler_ThreadProc+0x111
00ddfef8 7c947545 000d4b70 7c99c3a0 000d59e8 SHLWAPI!ExecuteWorkItem+0x1d
00ddff40 7c947583 77f4952b 000d4b70 00000000 ntdll!RtlpWorkerCallout+0x70
00ddff60 7c947645 00000000 000d4b70 000d59e8 ntdll!RtlpExecuteWorkerRequest+0x1a
00ddff74 7c94761c 7c947569 00000000 000d4b70 ntdll!RtlpApcCallout+0x11
00ddffb4 7c80b683 00000000 0007de34 0007de34 ntdll!RtlpWorkerThread+0x87
00ddffec 00000000 7c930760 00000000 00000000 kernel32!BaseThreadStart+0x37
问题是这样的:
起初是CFileDialog 遇到异常退出的问题,如下两行代码测试:
CFileDialog dlg(true);
dlg.DoModal();
多次打开文件
的时候,第一次随便选择一个,第二次选择桌面的一个.txt文件,当鼠标移动到这个.txt文件(或者用键盘选择到)的时候,程序
就崩溃了,测试一下记事本,也是一样的情况。
后来跟踪了一下,发现是pdf
shell.dll模块引起的问题,我的环境是xp sp2+Adobe7,换成Adobe8.1.2仍然存在这个情况,但在2003系统
在没有问题。以上说的都是中文
版。
再讲一些细节:
pdfshell.dll并不在进程内存一直存在,当程序调用“打开文件”对话框的时候,他还没有插入进来,当选择一个文件,或者鼠标移动到一个文件,进程被插入
:/Program Files/Common Files/Adobe/Acrobat/ActiveX
路径下的pdfshell.dll和pdfshell.CHS
选定了文件点击“打开”按钮之后,pdfshell.dll卸载,只留下pdfshell.CHS
引发异常的时候,程序崩溃在shell32.dll,GetLastError的值是1008,ERROR_NO_TOKEN
笔者水平有限时间
有限,文章只做抛砖引玉,不当之处,欢迎讨论
相关文章推荐
- WinAPI:GetOpenFileName、GetSaveFileName、OFNHookProc
- 资源地址;浏览和打开文件;GetOpenFileName;GetSaveFileName;OPENFILENAME;PtrToStringChars;.NET类库的打开文件夹操作
- 使用 OPENFILENAME 以及 GetOpenFileName、GetSaveFileName 实现打开,保存对话框
- 使用GetOpenFileName和GetSaveFileName函数会改变当前目录的问题
- 子类化GetOpenFileName/GetSaveFileName, 以及钩子函数OFNHookProc的使用的简要说明
- 子类化GetOpenFileName/GetSaveFileName, 以及钩子函数OFNHookProc的使用的简要说明
- 文件打开(保存)对话框:GetOpenFileName和 GetSaveFileName
- GetSaveFileName弹出文件选择框居中显示
- 对GetOpenFileName函数很无语
- vba使用win32 API(GetOpenFileName )实现打开文件对话框
- vba使用win32 API(GetOpenFileName )实现打开文件对话框
- GetSaveFileName函数
- WIN32的保存文件对话框GetSaveFileName
- Get the file name and extension in Shell
- Win764bit上安装32位Oracle10g出现错误:无法定位程序输入点GetProcessImageFileNameW于动态链接库PSAPI.DLL
- GetModuleFileName函数当前运行exe或dll的路径
- vba使用win32 API(GetOpenFileName )实现打开文件对话框
- MFC通用对话框之GetSaveFileName
- filegetname方法+filegetname(desc_bfile,directory,filename)+使用filegetname方法
- vba使用win32 API(GetOpenFileName )实现打开文件对话框