shell\comdlg32\fileopensave.cpp(9456)\COMDLG32.dll!

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Q1302182594/article/details/50466608

    版本信息:Win10(64bit) + Qt5.4.2(64bit)+QtCreator3.4.1

1 错误描述

    通过下面的方法打开文件时:

    QString fileName;
    fileName = QFileDialog::getOpenFileName( this,
        tr("Load RootSystem"), tr(" "), tr("RootSystem (*.dat)") );
    在应用程序程序输出窗口中提示:

shell\comdlg32\fileopensave.cpp(9456)\COMDLG32.dll!00007FFCD579260A: (caller: 00007FFCD579A866) ReturnHr[PreRelease](1) tid(22a8) 80070490 找不到元素。
    CallContext:[\PickerModalLoop\InitDialog\FileDialogInitEnterpriseData] 

2 问题分析

    根据参考资料[3]关于QFileDialog的说明,上述关于QFileDialog::getOpenFileName()的调用时没有错误的,而参考资料[1]则给我们提示,这应该是Win10的问题。


参考资料

[1]why is windows10 polluting the debuglog?

[2]Open and Save As Dialog Boxes

[3]Qt 打开文件的默认路径 QFileDialog::getOpenFileName()

展开阅读全文

COMDLG32库保存文件对话框不返回扩展名?

04-15

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\rn* *rn| 保存文件对话框用COMDLG32库 |rn* 可用成员变量: *rn| string Filter => 这个成员容许指定在一个目录个别地筛选; |rn* integer FilterIndex => 缺省过滤器索引 *rn| string InitialDir => 缺省对话框路径 |rn* string Title => 对话框标题 *rn| long Flags => 对话框指针 |rn* string Filename => 返回选择文件 *rn| string Files[] => 选择文件列的数组 |rn* string PathName => 文件的路径 *rn| integer FileCount => 选择文件数目 |rn* 作者:肖尚德 2001年7月5日 *rn\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/rnrnOPENFILENAME SaveFileNamernstring ls_Token, Filters[]rninteger li_TabPos, li_StartrnSaveFileName.lStructSize = 76rnSaveFileName.hWndOwner = hWndParentrnSaveFileName.hInstance = 0rnSaveFileName.lpstrFilter = LocalAlloc(LMEM_ZEROINIT,Len(Filter) + 2) rnIf SaveFileName.lpstrFilter = 0 Thenrn MessageBox("Error","Cannot alloc requested memory!",StopSign!,Ok!)rn Return(False)rnEnd Ifrn// Tab separator to Null separator rnli_Start = 1rnli_TabPos = Pos(Filter,"~t",1)rnDo While li_TabPos > 0rn ls_Token = Mid(Filter,li_Start,li_TabPos - li_Start)rn StrCopy(SaveFileName.lpstrFilter + (li_Start - 1),ls_Token,Len(ls_Token))rn li_Start = li_TabPos + 1rn li_TabPos = Pos(Filter,"~t",li_TabPos + 1)rn Filters[UpperBound(Filters) + 1] = Mid(ls_Token,2)rnLooprnls_Token = Mid(Filter,li_Start)rnStrCopy(SaveFileName.lpstrFilter + (li_Start - 1),ls_Token,Len(ls_Token))rnSaveFileName.lpstrCustomFilter = 0rnSaveFileName.nMaxCustomFilter = 0rnSaveFileName.nFilterIndex = FilterIndexrnSaveFileName.lpstrFile = LocalAlloc(LMEM_ZEROINIT,MAXFILENAME) rnStrCopy(SaveFileName.lpstrFile,filename,Len(filename))rnSaveFileName.nMaxFile = MAXFILENAMErnSaveFileName.lpstrFileTitle = LocalAlloc(0,MAXFILENAME)rnSaveFileName.nMaxFileTitle = MAXFILENAMErnSaveFileName.lpstrInitialDir = LocalAlloc(0,MAXPATHNAME)rnStrCopy(SaveFileName.lpstrInitialDir,InitialDir,Len(InitialDir))rnSaveFileName.lpstrTitle = LocalAlloc(0,255)rnStrCopy(SaveFileName.lpstrTitle,Title,Len(Title)+2)rnSaveFileName.Flags = FlagsrnSaveFileName.nFileOffSet = 0rnSaveFileName.nFileExtension = 0rnSaveFileName.lpstrDefExt = 0rnSaveFileName.lCustData = 0rnSaveFileName.lpfnHook = 0rnSaveFileName.lpTemplateName = 0rnrnrnIf GetSaveFileNameA(SaveFileName) = 1 Then //按确定按钮rn PathName = Left(String(SaveFileName.lpstrFile,"address"),SaveFileName.nFileOffSet - 1)rn FileName = String(SaveFileName.lpstrFile + SaveFileName.nFileOffSet,"address")rn If SaveFileName.nFileExtension = Len(PathName) + Len(FileName) + 1 Then //只要这句改为不等于就能返回扩展名,但保存最后一种类型的文件时,就会提示Array boundary exceeded at line 63 in function savedialog of object nvo_commdlg,指的就是下面那一行,请教高手应该如何改才好?rn FileName += Filters[2 * SaveFileName.nFilterIndex]rn End IfrnElsern FileName = ""rnEnd IfrnrnLocalFree(SaveFileName.lpstrFilter)rnLocalFree(SaveFileName.lpstrFile)rnLocalFree(SaveFileName.lpstrFileTitle)rnLocalFree(SaveFileName.lpstrTitle)rnLocalFree(SaveFileName.lpstrInitialDir)rnReturn(FileName <> "")rn 论坛

关于COMDLG32.DLL调用通用对话框函数的Flags标记问题!

07-02

参考网上一些资料,本人按照自己常用的使用习惯写了个纯API实现 打开文件(GetOpenFileName)和 保存文件(GetSaveFileName)的模块,应该说主要功能使用一些正常。rnrn但是为了学习和增强模块功能和实用性,对上述2个函数都必须的参数(参数类型为结构:OPENFILENAME),我仔细阅读了其每个成员的意义并都在尝试,基本没问题。比较复杂的是其 Flags 成员,指定标志位以实现对话框的不同功能和外观。rnrn该成员有很多标志可以组合指定,对于其中个别几个,我多次尝试却还有不少疑问,因此咨询一下前辈高手们,有对这个函数或这个结构比较了解的望不吝赐教:rnrn以下是我有疑问的一些标志,先附上英文注释再跟上我自己的翻译(可能不准确),最后再写出我有疑问的地方:rn====================================================rn1、OFN_NOCHANGEDIRrnRestores the current directory to its original value if the user changed the directory while searching for files. rnWindows NT 4.0/2000/XP: This flag is ineffective for GetOpenFileName.rn----------rn如果用户选择文件时更改了目录则在完毕后恢复当前目录到原始值.(在NT/2K/XP系统中,本标志对 GetOpenFileName 函数无效)rn----------rn按照注释,如果使用 GetOpenFileName 函数(我的是XP系统),则即使使用了该标志,在当前目录被改变时也无法恢复为原始的当前目录,可我实际测试(在函数开始前后均DEBUG.PRINT CURDIR)是可以恢复为选择文件之前的原始目录的,这是为什么呢?rnrn2、OFN_NOVALIDATErnSpecifies that the common dialog boxes allow invalid characters in the returned file name. Typically, the calling application uses a hook procedure that checks the file name by using the FILEOKSTRING message. If the text box in the edit control is empty or contains nothing but spaces, the lists of files and directories are updated. If the text box in the edit control contains anything else, nFileOffset and nFileExtension are set to values generated by parsing the text. No default extension is added to the text, nor is text copied to the buffer specified by lpstrFileTitle. If the value specified by nFileOffset is less than zero, the file name is invalid. Otherwise, the file name is valid, and nFileExtension and nFileOffset can be used as if the OFN_NOVALIDATE flag had not been specified.rn------------rn指定对话框返回的文件名允许包含无效字符.典型地,调用程序使用回调函数通过 FILEOKSTRING 消息检查文件名.如果文件名编辑框中的文本为空或只包含空格,则会更新文件与目录列表.如果包含其他字符,将通过该字符来设置 nFileOffset 和 nFileExtension 成员的值. lpstrFileTitle 成员设置的默认扩展名不会添加到文本字符中,也不会复制该文本字符到 lpstrFileTitle 缓冲. 如果 nFileOffset 成员的值小于 0 则文件名无效,否则文件名有效并且如果未指定本标志,则 nFileExtension 和 nFileOffset 可以被使用.rn------------rn这个标志仅是按字面翻译,实际作用我一点没理解,望高手予以解答。rnrn3、OFN_EXTENSIONDIFFERENTrnSpecifies that the user typed a file name extension that differs from the extension specified by lpstrDefExt. The function does not use this flag if lpstrDefExt is NULL.rn-----------rn允许用户输入的文件扩展名不同于 lpstrDefExt 成员中指定的扩展名(当 lpstrDefExt 成员为空时本标志无效).rn-----------rn按照注释的话,意思是如果没有这个标志(而此时 lpstrDefExt 还不为空),那就是不允许用户输入不同于 lpstrDefExt 中默认的扩展名的文件喽???可实际测试,无论怎么指定,我都可以输入不同于 lpstrDefExt 中扩展名的文件并可以正常返回啊???rnrn4、OFN_NOREADONLYRETURNrnSpecifies that the returned file does not have the Read Only check box selected and is not in a write-protected directory.rn------------rn设置返回的文件不带只读属性且不位于写保护目录中.rn------------rn这个注释非常简单明了,本来很好理解的。可我实际测试中发现,只要带上该标志,程序会立即崩溃(无任何提示),这是为什么啊???rnrn5、OFN_NONETWORKBUTTONrnHides and disables the Network button.rn------------rn隐藏并禁止 网络 按钮.rn------------rn这个注释更简单,我想问的是:Network button 到底指的是哪个按钮啊?我怎么看不到???rnrn6、OFN_NODEREFERENCELINKSrn--------------rnDirects the dialog box to return the path and file name of the selected shortcut (.LNK) file. If this value is not specified, the dialog box returns the path and file name of the file referenced by the shortcut.rn--------------rn如果用户选择了快捷方式(.LNK)文件,设置了本标志使对话框返回快捷方式的路径和文件名,否则返回的是快捷方式目标的路径和文件名.rn--------------rn按照注释,使用该标志则选 .LNK 文件时返回的就是 .LNK 文件路径;没设置返回的是 .LNK 目标的实际路径。可我测试发现,无论有无此标志,返回的都是 .LNK 文件呢(返回不了其实际目标)?这是为什么???rnrn7、OFN_ENABLEINCLUDENOTIFYrnWindows 2000/XP: Causes the dialog box to send CDN_INCLUDEITEM notification messages to your OFNHookProc hook procedure when the user opens a folder. The dialog box sends a notification for each item in the newly opened folder. These messages enable you to control which items the dialog box displays in the folder's item list.rn-------------rn2K/XP以上. 当用户打开目录时促使对话框向回调函数(OFNHookProc)发送 CDN_INCLUDEITEM 通知消息.对话框向新打开的目录中的每个项目都发送通知,这些消息允许控制对话框中的哪些项目显示在目录项目列表中.rn-------------rn这个标志涉及到向回调函数发送消息,可郁闷的是,无论我是否指定回调函数,只要设置了该标志,那么程序就发出 CDERR_INITIALIZATION(对话框初始化失败,发生该错误的原因通常为内存不足.) 这个错误呢???rnrn8、OFN_FORCESHOWHIDDENrnWindows 2000/XP: Forces the showing of system and hidden files, thus overriding the user setting to show or not show hidden files. However, a file that is marked both system and hidden is not shown.rn--------------rn2K/XP以上. 强制显示系统文件和隐藏文件,无论系统设置是否显示隐藏文件.但是,如果某文件同时带有系统属性和隐藏属性则不会显示.rn--------------rn按照注释,带有系统属性或者带有隐藏属性的文件(只要不是这2个属性同时都有),那么带上该标志就会显示。而我实际测试,把某文件设置为隐藏属性(无系统属性),可即使带了本标志,也显示不出来啊???rnrn========================================rn基本就这么多了。本人分数有限,暂时设置每个标志问题=5分吧,8个问题共40分,外加10分为个别难于解答的标志。rnrn希望各位前辈不要嫌弃分数少,多多指点,谢谢!!! 论坛

没有更多推荐了,返回首页