• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 调用API:SHBrowseForFolder选择文件夹总是报错,为什么?

调用API:SHBrowseForFolder选择文件夹总是报错,为什么?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了shbrowseforfolder,openapi是什么文件夹,openapi文件夹,openapi文件夹能删,excel调用文件夹图片等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 调用API:SHBrowseForFolder选择文件夹总是报错,为什么?
描述:

我写了一个选择文件夹的函数,代码如下:
VOID SelectPath(HWND hwnd)
{
BROWSEINFO bi = { 0 };
LPMALLOC pMlc;
TCHAR szDisplayName[MAX_PATH];
TCHAR szPath[MAX_PATH];
SecureZeroMemory(szDisplayName, sizeof(szDisplayName)); // Clear memory
SecureZeroMemory(szPath, sizeof(szPath));
if (SHGetMalloc(&pMlc) == E_FAIL)
{
MessageBox(hwnd, 
TEXT("Call to SHGetMalloc() failed."),
TEXT("Error"),
MB_OK | MB_ICONERROR);
return;
}
bi.hwndOwner = hwnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szDisplayName;
bi.lpszTitle = TEXT("Please select the path to create the file:");
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS;
LPITEMIDLIST pIdl = SHBrowseForFolder(&bi);
if (pIdl == NULL)
{
pMlc->Release();
return;
}
SHGetPathFromIDList(pIdl, szPath);
if (szPath[lstrlen(szPath) - 1] != TEXT('\\'))
lstrcat(szPath, TEXT("\\"));
SetWindowText(GetDlgItem(hwnd, IDC_PATH), szPath);
pMlc->Free(pIdl);
pMlc->Release();
}
在程序的初始化过程中我已经调用了CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)函数用来加载COM library,在程序的结束过程中也调用了CoUninitialize()函数用来关闭COM library。
在程序的执行过程中,首次调用SelectPath()时运行正常,但是当我第二或者第三次调用SelectPath()时程序就有可能报如下错误:
“xxx”指令引用的内存“xxx”。该内存不能为“written”。
而且该错误不是总能再现的,但是出现频率较高。
请大侠们指点迷津,非常感谢!


解决方案1:

pMlc->Release();这句好像不用

解决方案2:

程序我改好了,发回去了,查收!主要就是在你的DoCreateUniqueData函数中,肯定还有其他的地方你主要一下。就是获得长度的要注意。wsprintf返回的是不包含结束符的长度,使用的时候应该加1。可能就是因为越界访问造成第二次出错!!!
dwLength += 1;//我添加的,应该含有一个结束符的长度
 //引用MSDN:If the function succeeds, 
 //the return value is the number of characters stored in the output buffer, 
 // not counting the terminating null character.


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • SHBrowseForFolder返回的结构体指针,应该如何释放?
  • SHBrowseForFolder这样的函数,它调用的COM组件是进程内的还是进程外的?
  • 调用API:SHBrowseForFolder选择文件夹总是报错,为什么?
  • 怎么让SHBrowseForFolder弹出的对话框直接显示当前文件夹,或者显示上一次打开的文件夹?
  • 调用API:SHBrowseForFolder选择文件夹总是报错,为什么?

相关文章

  • 2017-06-05 怎么将字符串转成GUID
  • 2017-06-05 为什么在外壳扩展DLL文件编程中,不可以使用CString??
  • 2017-06-04 VC程序制作安装包问题
  • 2017-06-04 MFC向导做的OCX插入网页,关闭IE时显示内存不能为read?Why?!
  • 2017-06-04 为什么在对话框的OnInitDialog处理函数中无法获取Datagrid控件的窗口句柄?
  • 2017-06-05 vs2005读取EXCEL2007中数据
  • 2017-06-05 急请教:Thethread0xD64hasexitedwithcode10x1什么意思呀
  • 2017-06-04 ATL对自定义事件的处理?
  • 2017-06-04 我想写个程序嵌入到网页上去,不知道怎么做比较好?
  • 2017-06-04 CoCreateInstance返回REGDB_E_CLASSNOTREG

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 紧急求救100分关于用VC对word操作
    • 关于explorerexe的hook问题
    • 求如何学习GIS
    • 通过继承线程类来查找处理文件,但是退出程序后,程序依然在运行!?在任务管理器中看得到!这是怎么回事,付原码
    • NewWindow2新链接如何在原窗口打开
    • MFC做activex控件,在自定义的方法中如何设置其参数的类型为二维数组
    • Thread訪問變量問題
    • GetWindowRect??
    • 对windowsAPI之SendMessage)熟悉的朋友帮个忙!谢谢!
    • 寻找VC++电子图书下载网詀?????

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有