免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:易道云信息技术研究院
上一个内容:73.游戏分析工具的添加对象与删除对象
73.游戏分析工具的添加对象与删除对象 它的代码会报堆被破坏的异常,堆被破坏的异常主要由两方面,第一个是内存超范围访问比如分配了10字节内存访问的时候访问了200个字节就是把是我们的内存给修改了就会出错,第二个二次释放第一次的时候把内存释放了第二次又删然后windows有内存管理的机制第二次删的就会把别的地方的内存给删了,避免这种异常在用指针的时候一定要初始化并且控制只删一次内存
COBJContext.h文件的修改
cpp
#pragma once
class COBJContext
{
CString txtFile;
CString txtName;
LPVOID Address;// 内存地址
/**
内存地址不是一个简单的数字,它有可能是一个 基址 加上 一个数字,有可能还是一个指针算出来的
然后这种的通过字符串进行记录,让它通过字符串可以算出内存地址
Address 与 txtAddress配套使用
*/
CString txtAddress;
DWORD Size{};
CString txtNote;
char* data{};
public:
COBJContext(const wchar_t* folder, const wchar_t* _name);
COBJContext(const wchar_t* folder, const wchar_t* _name, const wchar_t * _address, DWORD _size, const wchar_t* _note);
~COBJContext();
public:
void Save();
void Delete();
BOOL UpdateData(HANDLE _hProcess);
void Set(const wchar_t* _name, const wchar_t* _address, DWORD _size, const wchar_t* _note, bool IsSet=true);
public:
DWORD GetSize();
CString& GetAddress();
CString& GetNote();
};
typedef struct TREE_DATA {
DWORD MenuId{};
LPVOID DATA_PTR{};
}*PTREE_DATA;
CwndRAN.cpp的修改
cpp
void CwndRAN::OnNMRClickTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
DWORD dMenuId = 1;
if (hProcess) {
auto hSel = mTree.GetSelectedItem();
if (hSel) {
PTREE_DATA val = (PTREE_DATA)mTree.GetItemData(hSel);
if (val)dMenuId = val->MenuId; else dMenuId = 0;
}
else dMenuId = 2;
}
if (dMenuId == 0)return;
// 获取最后一个消息发生时的鼠标位置
DWORD dwPos = GetMessagePos();
CPoint point(LOWORD(dwPos), HIWORD(dwPos));
CMenu menu;
menu.LoadMenuW(IDR_MENU1);
CMenu* pop = menu.GetSubMenu(dMenuId);
pop->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
void CwndRAN::DeleteItemEx(HTREEITEM h)
{
PTREE_DATA val = (PTREE_DATA)mTree.GetItemData(h);
if (val)delete val;
mTree.DeleteItem(h);
}
void CwndRAN::OnDeleteClass()
{
// TODO: 在此添加命令处理程序代码
auto hSel = mTree.GetSelectedItem();
auto hRoot = mTree.GetRootItem();
if (hSel == hRoot)return;
auto h = GetFirstItem(hSel);
PTREE_DATA VAL = (PTREE_DATA)mTree.GetItemData(h);
if (VAL) {
COBJContext* p = (COBJContext*)VAL->DATA_PTR;
if (p) {
p->Delete();
delete p;
}
}
DeleteItemEx(h);
}