请教 对内存管理方面比较熟悉的达人有关函数内变量回收问题

l51 2008-08-20 07:23:38

int showTray(int icoID,HWND hWnd, UINT uCallMsg,int op,int id=0);

int showTray(int icoID,HWND hWnd, UINT uCallMsg,int op,int id){
// iconID:窗体的第几个托盘图标, hWnd: 主窗体句柄, uCallMsg:托盘事件映射的消息, id 取路径icons下第几个图标 , op 操作编号1添加2更改0删除
WCHAR icoPath[64]={0};
wsprintf(icoPath,L"icons\\%u_%u.ico",icoID,id);
NOTIFYICONDATA IconData[1];
IconData[id].cbSize=sizeof(NOTIFYICONDATA);
//IconData[id].uVersion=NOTIFYICON_VERSION; // the NOTIFYICONDATA is for Win2000 and later.
IconData[id].hIcon=(HICON)LoadImage(NULL,icoPath,IMAGE_ICON,0,0,LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
wsprintf(IconData[id].szTip,L"SZRProjSvc");
//strcpy(IconData[id].szTip,L"SZRProjSvc");
IconData[id].uFlags= NIF_ICON | NIF_MESSAGE; //| NIF_INFO ;
IconData[id].uCallbackMessage=uCallMsg;
IconData[id].hWnd=hWnd;
IconData[id].uID=icoID;

switch(op){
case 1:
Shell_NotifyIcon(NIM_ADD,&IconData[id]) ;
break;
case 2:
Shell_NotifyIcon(NIM_MODIFY,&IconData[id]) ;
break;
case 0:
Shell_NotifyIcon(NIM_DELETE,&IconData[id]) ;
break;
}

LocalFree(IconData);
LocalFree(icoPath);
return 0;
}

showTray(101,hWnd,WM_TRAYICONMSG,1); //新增托盘图标
showTray(101,hWnd,WM_TRAYICONMSG,2,1); // 更改托盘101号托盘的图标为1号图标(默认0号)
showTray(101,hWnd,WM_TRAYICONMSG,0); //删除托盘图标


上面的函数调用时, 新增和删除托盘图标都正确,唯独更改托盘图标时,会提示 IconData 的内存区域存在错误,我用的是 VS 2008 / WIN XP SP2的环境.
函数内的 LocalFree(IconData); 和 LocalFree(icoPath); 基本不起作用,
并且进入反汇编调试时,断点是在函数返回时,说明是系统在回收 IconData,icoPath 时才出错,
望高手指点一二, 万分感谢!

...全文
38 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
l51 2008-08-21
  • 打赏
  • 举报
回复
晕了,真是这个简单的笔误,自己找了大半天,愣没发现,
谢谢谢谢~~~~
npuhuxl 2008-08-20
  • 打赏
  • 举报
回复
NOTIFYICONDATA IconData[1];
你确引用IconData[id],id=1,内存访问会出错的

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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