CTabCtrl的问题:获取TAB 的ITEM的LPARAM时导致CRASH,郁闷了很久没有答案,高分求解!

andy_123 2007-11-23 04:14:08
CTabCtrl:
添加TAB:
............................
CString title = "TAB1";
CString lparamText = .......
TC_ITEM tItem;
tItem.mask = TCIF_TEXT | TCIF_PARAM | TCIF_IMAGE;
tItem.pszText = (LPSTR)title.GetBuffer();
title.ReleaseBuffer();
tItem.lParam = reinterpret_cast<DWORD>(new CString(lparamText));
tItem.cchTextMax = strlen(tItem.pszText);
mTab.InsertItem(0,&tItem);
.........................
获取TAB 的ITEM的LPARAM:
....................
CString *pString = reinterpret_cast<CString*>(tItem.lparam);
CString g = pString->GetBuffer(); //在RELEASE下这一行导致CRASH ,
pString->ReleaseBuffer();
return g;
...全文
78 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gentlelotus 2007-11-23
  • 打赏
  • 举报
回复
tItem.pszText指向了一个局部的内存块(由于title是局部变量),所以我推测很可能是内存越界访问造成的问题。
另外,不得不说,楼主对于CString的使用方式确实不值得提倡,完全违背了CString的设计意图。而且程序中的强转也使用过度,象CString g = pString-> GetBuffer();这样的拷贝完全没有必要使用非常量指针,如楼上所说直接返回*pString就足够了。
an_bachelor 2007-11-23
  • 打赏
  • 举报
回复
那样不行的 CString*不能直接转成LPSTR

lz的代码中主要错误好像大都是ReleaseBuffer之后 仍然使用GetBuffer返回的指针
比如
tItem.lParam = reinterpret_cast <DWORD> (new CString(lparamText));
tItem.cchTextMax = strlen(tItem.pszText);

不过个人觉得还不至于在拷贝pString-> GetBuffer();的时候会出错啊

CString g = pString-> GetBuffer(); //在RELEASE下这一行导致CRASH ,
pString-> ReleaseBuffer();
return g;
这几句直接改
return *pString;看看
andy_123 2007-11-23
  • 打赏
  • 举报
回复
不行啊,这样取到的是乱码
凤矶 2007-11-23
  • 打赏
  • 举报
回复
CString g(LPSTR(tItem.lparam));

15,979

社区成员

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

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