描述:
我写了一个选择文件夹的函数,代码如下:
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.