有关Shell编程:IMalloc::Free()在_MBCS下编译运行正常,在_UNICODE下失败

ChenLiuqing 2005-08-22 06:06:58
我现在是实现一个Shell Tree显示桌面为根的树状列表
typedef struct tagID
{
// Contains the LPIDL of the desktop
LPSHELLFOLDER lpsfParent;
// Contains the LPITEMIDLIST of the file / folder relatived
// to the parent folder
LPITEMIDLIST lpi;
// Contains the full LPITEMIDLIST of the file / folder relatived
// to the desktop
LPITEMIDLIST lpifq;
} TVITEMDATA, *LPTVITEMDATA;
用这个结构作为TREEITEM 的lParam
下面是几个相关的函数
// Get the subfolders of the current folder and display them
// Params:
// lpsf: the ISHELLFOLDER object of the folder
// lpifq
void CShellTreeCtrl::DisplaySubItems(LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent)
{
// the TV_ITEM struct used to insert item
TV_ITEM tvi;
// The TV_INSERTSTRUCT struct of the item to be inserted
TV_INSERTSTRUCT tvins;
// The previouse added item handle
HTREEITEM hPrevTreeItem = NULL;
// IEnumIDList interface point
LPENUMIDLIST lpe = NULL;
LPITEMIDLIST lpi = NULL, lpiTemp = NULL, lpidlThisItem = NULL;
LPTVITEMDATA lptvid = NULL;
LPMALLOC lpMalloc = NULL;
// ULONG ulFetched;
// Count
UINT uCount=0;
HRESULT hr;
TCHAR szBuff[MAX_PATH];
// The handle of the parent window
HWND hwnd = GetParent()->m_hWnd;

// Alloc shell memory
hr = SHGetMalloc( &lpMalloc );
if (FAILED(hr))
return;

// Get the IEnumIDList of the IShellFolder interface
hr = lpsf->EnumObjects(hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &lpe);

if (SUCCEEDED(hr))
{
while (S_OK == lpe->Next(1, &lpi, NULL))
{
// Attributes flag: is folder and if has sub folder
ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_LINK;
lpsf->GetAttributesOf(1, (const struct _ITEMIDLIST **)&lpi, &ulAttrs);
// If the current item is directory
if (ulAttrs & SFGAO_FOLDER)
{
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

//if (ulAttrs & SFGAO_HASSUBFOLDER)
//{
// tvi.cChildren=1;
// tvi.mask |= TVIF_CHILDREN;
//}

// Alloc memory
lptvid = (LPTVITEMDATA)lpMalloc->Alloc(sizeof(TVITEMDATA));
if (!lptvid)
goto Done;

// Get the item name
if (!GetName(lpsf, lpi, SHGDN_NORMAL, szBuff))
goto Done;
tvi.pszText = szBuff;n
#ifdef DEBUG
TRACE( _T("Displaying %s\r\n"), szBuff );
#endif
// If the folder has sub folders / files,
// set corresponding Treectrl item attribute
if( (ulAttrs & SFGAO_HASSUBFOLDER) || HasGotSubEntries(lpsf, lpi) )
{
tvi.cChildren=1;
tvi.mask |= TVIF_CHILDREN;
}

tvi.cchTextMax = _MAX_PATH;
lpidlThisItem = ConcatPidls(lpifq, lpi);

//Copy ITEMIDLIST
lptvid->lpi = CopyITEMID(lpMalloc, lpi);

tvi.iImage = GetIconIndex(lpidlThisItem);

tvi.iSelectedImage = GetSelIconIndex(lpidlThisItem);
// Save the parent folder
lptvid->lpsfParent = lpsf;
lpsf->AddRef();

lptvid->lpifq = ConcatPidls(lpifq, lpi);

tvi.lParam = (LPARAM)lptvid;
// Insert a file / folder item to treectrl
tvins.item = tvi;
tvins.hInsertAfter = hPrevTreeItem;
tvins.hParent = hParent;
hPrevTreeItem = InsertItem(&tvins);
}
else
// Ignoure the shortcuts
if( !(SFGAO_LINK & ulAttrs) )
{
tvi.mask= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

// Alloc memory
lptvid = (LPTVITEMDATA)lpMalloc->Alloc(sizeof(TVITEMDATA));
if (!lptvid)
goto Done;

// Get the item name
if (!GetName(lpsf, lpi, SHGDN_NORMAL, szBuff))
goto Done;
///*
// If m_sFileFilter is not empty, do the estimate work
if( !m_sFileFilter.IsEmpty() )
{
if( !MatchFilters(szBuff) )
{
lpMalloc->Free(lpidlThisItem);
lpidlThisItem = 0;
continue;
}
}//*/
tvi.pszText = szBuff;
tvi.cchTextMax = MAX_PATH;
lpidlThisItem = ConcatPidls(lpifq, lpi);

//Copy ITEMIDLIST
lptvid->lpi = CopyITEMID(lpMalloc, lpi);

tvi.iImage = GetIconIndex(lpidlThisItem);
tvi.iSelectedImage = GetSelIconIndex(lpidlThisItem);
// Save the parent folder
lptvid->lpsfParent = lpsf;
lpsf->AddRef();

//lptvid->lpifq = ConcatPidls(lpifq, lpi);
lptvid->lpifq = lpidlThisItem;

tvi.lParam = (LPARAM)lptvid;
// Insert a file / folder item to TreeCtrl
tvins.item = tvi;
tvins.hInsertAfter = hPrevTreeItem;
tvins.hParent = hParent;
hPrevTreeItem = InsertItem(&tvins);
}
if( lpidlThisItem )
{
lpMalloc->Free( lpidlThisItem );
lpidlThisItem = 0;
}
}// End while
// Free memory.
if( lpi )
{
lpMalloc->Free(lpi);
lpi=0;
}
} // end if
// Do the clean up work
Done:
if (lpe)
lpe->Release();
if (lpi && lpMalloc)
lpMalloc->Free(lpi);
if (lpidlThisItem && lpMalloc)
lpMalloc->Free(lpidlThisItem);
if (lpMalloc)
lpMalloc->Release();
}
...全文
247 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodboyws 2005-08-23
  • 打赏
  • 举报
回复
内存越界了,估计就是楼上说的问题
everandforever 2005-08-23
  • 打赏
  • 举报
回复

LPITEMIDLIST CShellTreeCtrl::ConcatPidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
中的
memcpy(((LPTSTR)pidlNew) + cb1, pidl2, cb2);
改成
memcpy(((BYTE*)pidlNew) + cb1, pidl2, cb2);
试试
ChenLiuqing 2005-08-23
  • 打赏
  • 举报
回复
结贴,goodboyws大侠来晚一步,意思一下,呵呵
ChenLiuqing 2005-08-23
  • 打赏
  • 举报
回复
花了半天终于把这个bug找出来了,本来是用的部分别人的代码,看来在没有吃透的情况下还是慎重的好。everandforever(Forever)说的是一个错误,非常感谢!另外一个是要把ITEMLIST结构的最后一位一定要写成0!
ChenLiuqing 2005-08-22
  • 打赏
  • 举报
回复
这是错误信息
HEAP[ResourceFinder.exe]: Heap block at 00170848 modified at 0017087A past requested size of 2a
Unhandled exception at 0x7c901230 in ResourceFinder.exe: User breakpoint.
HEAP[ResourceFinder.exe]: Invalid Address specified to RtlFreeHeap( 00150000, 00170850 )
Unhandled exception at 0x7c901230 in ResourceFinder.exe: User breakpoint.
The program '[2952] ResourceFinder.exe: Native' has exited with code 0 (0x0).
ChenLiuqing 2005-08-22
  • 打赏
  • 举报
回复
在用_MBCS编译运行的时候很正常,改为_UNICODE编译以后,在列举My Computer下面的磁盘项目时报错,break时显示停在
void CShellTreeCtrl::DisplaySubItems(LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent)
函数中的这一行,
lpMalloc->Free( lpidlThisItem );

请对Shell编程熟悉的大侠帮忙看看,100分相送,不够再加!
ChenLiuqing 2005-08-22
  • 打赏
  • 举报
回复
LPITEMIDLIST CShellTreeCtrl::ConcatPidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
LPITEMIDLIST pidlNew;
UINT cb1;
UINT cb2;

if (pidl1) //May be NULL
cb1 = GetSize(pidl1) - sizeof(pidl1->mkid.cb);
else
cb1 = 0;

cb2 = GetSize(pidl2);

pidlNew = CreatePidl(cb1 + cb2);
if (pidlNew)
{
if (pidl1)
memcpy(pidlNew, pidl1, cb1);
memcpy(((LPTSTR)pidlNew) + cb1, pidl2, cb2);
}
return pidlNew;
}

LPITEMIDLIST CShellTreeCtrl::CopyITEMID(LPMALLOC lpMalloc, LPITEMIDLIST lpi)
{
LPITEMIDLIST lpiTemp;

lpiTemp=(LPITEMIDLIST)lpMalloc->Alloc( lpi->mkid.cb + sizeof(lpi->mkid.cb) );
CopyMemory((PVOID)lpiTemp, (CONST VOID *)lpi, lpi->mkid.cb + sizeof(lpi->mkid.cb));

return lpiTemp;
}

LPITEMIDLIST CShellTreeCtrl::CreatePidl(UINT cbSize)
{
LPMALLOC lpMalloc;
HRESULT hr;
LPITEMIDLIST pidl = NULL;

hr = SHGetMalloc(&lpMalloc);

if (FAILED(hr))
return 0;

pidl=(LPITEMIDLIST)lpMalloc->Alloc(cbSize);

if (pidl)
memset(pidl, 0, cbSize); // zero-init for external task alloc

if (lpMalloc)
lpMalloc->Release();

return pidl;
}

LPITEMIDLIST CShellTreeCtrl::GetNextItemID(LPCITEMIDLIST pidl)
{
// Check for valid pidl.
if(pidl == NULL)
return NULL;

// Get the size of the specified item identifier.
int cb = pidl->mkid.cb;

// If the size is zero, it is the end of the list.
if (cb == 0)
return NULL;

// Add cb to pidl (casting to increment by bytes).
pidl = (LPITEMIDLIST) (((LPBYTE) pidl) + cb);

// Return NULL if it is null-terminating, or a pidl otherwise.
if( pidl->mkid.cb == 0 )
return NULL;
else
return (LPITEMIDLIST)pidl;
//return (pidl->mkid.cb == 0) ? NULL : (LPITEMIDLIST) pidl;
}
内容概要:本文档详细介绍了光伏储能单相逆变器并网的Simulink仿真模型,重点聚焦于逆变器在并网过程中的动态行为分析与先进控制策略的设计与实现。该模型涵盖主电路结构、PWM调制技术、锁相环(PLL)同步控制、电流环调节等核心环节,并基于Matulink平台完成系统建模与仿真验证,能够有效研究并网电能质量、系统稳定性及控制算法性能。特别地,模型支持在弱电网条件下进行仿真,适用于分析谐波、电压不平衡、电压波动等电能质量问题,同时结合“阻抗建模”与“扫频法”等技术手段,深入探讨并网系统的交互稳定性与振荡机理,具有较强的理论深度与工程应用价值。; 适合人群:具备电力电子、自动控制理论或新能源发电系统基础知识的研究生、科研人员,以及从事光伏逆变器开发、微电网控制与并网稳定性研究的工程技术人员。; 使用场景及目标:①用于高校及科研机构开展光伏并网逆变器控制策略的教学演示与学术研究;②辅助企业工程师进行并网性能测试、控制器参数优化与系统稳定性评估;③支撑VSG控制、构网型变流器、阻抗建模、宽频振荡分析等相关前沿课题的仿真验证与论文复现工作。; 阅读建议:建议在MATLAB/Simulink环境中动手搭建并调试模型,逐步理解各模块功能与参数影响,重点关注控制器设计与系统动态响应之间的关系,并结合文中提及的“正负序阻抗建模”“扫频辨识”等方法深化对并网稳定性的理论认识与实践能力。
内容概要:本文针对“计及用户需求响应贡献度的综合能源系统多时间尺度优化”问题,提出了一种基于Matlab代码实现的精细化优化模型。该模型深度融合电、热、气等多种能源形式的耦合特性,构建了涵盖日前、日内及实时等多个时间尺度的协调优化调度框架。研究重点在于量化用户在不同场景下的需求响应行为及其对系统运行的贡献度,并将其纳入优化目标,从而提升综合能源系统的运行经济性、稳定性和灵活性。文中系统阐述了模型的数学建模过程,包括以综合运行成本最小化为核心的目标函数、涵盖能量平衡、设备运行约束及用户响应能力的多重约束条件,并详细说明了基于Matlab的求解算法与代码实现流程,为相关研究提供了可复现的技术路径。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员和工程技术人员,特别适用于从事综合能源系统规划、需求响应机制设计、微电网优化运行等领域研究的专业人士。; 使用场景及目标:①研究多能互补背景下综合能源系统的协同优化调度策略;②量化分析用户需求响应对系统削峰填谷、降低运行成本及提升可再生能源消纳能力的具体贡献;③实现多时间尺度优化模型的设计、仿真与性能验证;④作为高水平学术论文复现、科研课题攻关或实际能源项目规划的技术支撑。; 阅读建议:建议读者结合Matlab代码逐模块深入理解,重点关注目标函数中用户贡献度的建模方法、多时间尺度耦合机制的实现逻辑以及优化求解器的配置与调用。在学习过程中,可尝试调整用户响应参数、引入新的能源设备模型或改变网络拓扑结构进行拓展性实验,以全面掌握综合能源系统优化的核心机理与应用技巧。

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧