两个很奇怪的内存泄露·附代码,请帮忙看看·小弟我是新手,多谢

两个很奇怪的内存泄露·附代码,请帮忙看看·我是新手,谢谢!
两个很奇怪的内存泄露·附代码,请帮忙看看·我是新手,谢谢!泄露全部是用BoundsChecker   7.2检查出来的。

★①   问题出在动态更改背景色上
COLORREF   crBColor   =   CIniFile::ReadInteger(TEXT( "HEALTH-OPTION "),   TEXT( "BackgroundColor "),   16777215);
SetClassLong(g_hWnd,   GCL_HBRBACKGROUND,   (long)CreateSolidBrush(crBColor));
提示:
Type Quantity Deallocator Allocation   Location Sequence

CreateSolidBrush 2 DeleteObject PreLockWindow   -   [UserFunction.h,   line   618   (***.exe)]


★②   问题出在HOOK键盘上
extern   "C "   DLLEXPORT   BOOL   EnableKeyboardHook(BOOL   bEnable)
{
if   (bEnable)
{
g_hhkKeyboard   =   SetWindowsHookEx(WH_KEYBOARD_LL,   (HOOKPROC)KeyHookProc,   g_hInstance,   0);
if   (!g_hhkKeyboard)   return   FALSE;
}
else
{
//   启用任务键
if   (g_hhkKeyboard)
{
UnhookWindowsHookEx(g_hhkKeyboard);
g_hhkKeyboard   =   NULL;
}
else
{
return   FALSE;
}
}
return   TRUE;
}
上面的这个函数,提示泄露原因:UnhookWindowsHookEx
可,我明明有对应的UnhookWindowsHookEx啊。

分不多了,请见谅!恳请明白人指点...


------解决方案--------------------
ReadInteger(TEXT( "HEALTH-OPTION "), TEXT( "BackgroundColor ")
使用参数代进去,不要用字符串值,可能不会立即释放
第二个暂不清楚
------解决方案--------------------
第一个 CreateSolidBrush 用完之后, 需要有 DeleteObject 删除创建的 Brush
------解决方案--------------------
我是说声明CString类的变量给ReadInteger
CString strSection,strValue
奇怪你这个类不是vc自带的吧,这个函数msdn找不到?可是我怎么看着这么眼熟啊
Delphi里转过来的?
------解决方案--------------------
1.改成这样
HBRUSH hBrush = CreateSolidBrush(crBColor);
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)hBrush);
...
DeleteObject(hBrush); // 用完后删除

2.即使你写了unhook代码,但这段代码是不可能进去的,你想想吧.
UnhookWindowsHookEx(g_hhkKeyboard);
------解决方案--------------------
SetClassLong后,调用UpdateWindow刷新一下窗口.
------解决方案--------------------
HBRUSH hbr = CreateSolidBrush(crBColor);
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)hbr);
DeleteObject(hbr);


将hbr申明为类的局部变量,类对象初始化时hbr = CreateSolidBrush(crBColor);在销毁时DeleteObject(hbr);
------解决方案--------------------

1.改成这样
HBRUSH hBrush = CreateSolidBrush(crBColor);
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)hBrush);
...
DeleteObject(hBrush); // 用完后删除
=======================
汗,竟然没明白这个省略号意思,
或者CreateSolidBrush后,选中并应用画刷,用完后删除...直接删除肯定不生效了
------解决方案--------------------
在dll退出的时候, unhook:

BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved

if (fdwReason == DLL_PROCESS_DETACH)
if (g_hhkKeyboard)
UnHook...;
);
------解决方案--------------------
你是不是在工作线程中做的啊,那就在工作线程结束时unhook