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

调用API:SHBrowseForFolder()选择文件夹总是报错,为什么? - 故障解答 - 电脑教程网

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

日期:2007-02-02   荐:
调用API:SHBrowseForFolder()选择文件夹总是报错,为什么?我写了一个选择文件夹的函数,代码如下:VOID SelectPath(HWND hwnd){BROWSEINFO bi = { 0 };LPMALLOC pMlc;TCHAR szDisplayName[MAX_PATH];TCHAR szPath[MAX_PATH];SecureZeroMemory(szDisplayName, sizeof(szDisplayName));// Clear memorySecureZeroMemory(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”。而且该错误不是总能再现的,但是出现频率较高。请大侠们指点迷津,非常感谢!程序中 Clear memory 这一行是注释,因为排版问题所以没有跟在 // 后面,而是跑到了下一行。pMlc->Release();这句好像不用UP如果可以,请将你完整的程序发到:[email protected]我帮你看看。应该是你调用此函数以后导致一些量没有复位。呵呵注明帖子的URL!程序我改好了,发回去了,查收!主要就是在你的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.
标签: