两个很奇怪的内存泄露·附代码,请帮忙看看·我是新手,谢谢!泄露全部是用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 SequenceCreateSolidBrush 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啊。分不多了,请见谅!恳请明白人指点...
COLORREF crBColor = CIniFile::ReadInteger(TEXT("HEALTH-OPTION"), TEXT("BackgroundColor"), 16777215);
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)CreateSolidBrush(crBColor));
提示:
Type Quantity Deallocator Allocation Location SequenceCreateSolidBrush 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啊。分不多了,请见谅!恳请明白人指点...
解决方案 »
- 关于进程问题
- 求助:MFC 实现Cab压缩
- 在服务器端建立监听 用tcp 和udp两种方式,在客户端的连接方式一样吗?
- 请问如何通过一个程序把另一个程序中的CCombobox
- 指针初始化问题,忘高手帮忙,比较急
- 为什么生成的动态菜单上的项目总是DISABLE状态?
- 请问:如何将BSTR转化成LPSTR,反过来呢?
- Windows下TCP的问题
- 请教高手:局域网内IP地址与网卡绑定的问题(还我自由!!)。。。
- 怎样在程序中调用Explorer.exe连接我的主页地址(NULL)
- 哪里有C++ Primer Plus fifth Edition 下啊?
- 如何得到Recordset中符合条件的记录数
使用参数代进去,不要用字符串值,可能不会立即释放
第二个暂不清楚
To Elysium:“使用参数代进去,不要用字符串值,可能不会立即释放”,我没看懂这句话,真抱歉,是指改写成这样吗?
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)CreateSolidBrush(CIniFile::ReadInteger(TEXT("HEALTH-OPTION"), TEXT("BackgroundColor"), 16777215)));To sgnaw: CreateSolidBrush 之后确实要DeleteObject,可是,我如果写成这样,就无法成功的更改背景色了。
HBRUSH hbr = CreateSolidBrush(crBColor);
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)hbr);
DeleteObject(hbr);
CString strSection,strValue
奇怪你这个类不是vc自带的吧,这个函数msdn找不到?可是我怎么看着这么眼熟啊
Delphi里转过来的?
我如果这样:
HBRUSH hbr = CreateSolidBrush(crBColor);
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)hbr);
DeleteObject(hbr);
虽然不存在资源泄露的问题,可是,无法更改背景色。为何这样就无法更改背景色呢?奇怪。
HBRUSH hBrush = CreateSolidBrush(crBColor);
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)hBrush);
...
DeleteObject(hBrush); // 用完后删除2.即使你写了unhook代码,但这段代码是不可能进去的,你想想吧.
UnhookWindowsHookEx(g_hhkKeyboard);
我如果这样:
HBRUSH hbr = CreateSolidBrush(crBColor);
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)hbr);
DeleteObject(hbr);?
1.改成这样
HBRUSH hBrush = CreateSolidBrush(crBColor);
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)hBrush);
...
DeleteObject(hBrush); // 用完后删除
==========
有什么区别?偶没看出来
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)hbr);
DeleteObject(hbr);将hbr申明为类的局部变量,类对象初始化时hbr = CreateSolidBrush(crBColor);在销毁时DeleteObject(hbr);
然后使用CBrush::CreateSolidBrush试一下
1.改成这样
HBRUSH hBrush = CreateSolidBrush(crBColor);
SetClassLong(g_hWnd, GCL_HBRBACKGROUND, (long)hBrush);
...
DeleteObject(hBrush); // 用完后删除
=======================
汗,竟然没明白这个省略号意思,
或者CreateSolidBrush后,选中并应用画刷,用完后删除...直接删除肯定不生效了
2.即使你写了unhook代码,但这段代码是不可能进去的,你想想吧.
UnhookWindowsHookEx(g_hhkKeyboard);是否需要单独写一个Unhook的函数?
新手,而且是自学编程,请抽空指点一下,十分感谢!!
{
g_hhkKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyHookProc, g_hInstance, 0);
if (!g_hhkKeyboard) return FALSE;
}
else
{
...
if (g_hhkKeyboard)
Unhook...
}
if (bEnable)
{
g_hhkKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyHookProc, g_hInstance, 0);
}
else
{
Unhook...
}
内存泄露的问题也一样存在。
如果写到一个作用域里,岂不安装之后立刻就被卸掉了?
不解。能否指点一下应该如何写。
我尝试写成:
case TRUE:
if (g_hhkKeyboard)
UnhookWindowsHookEx(g_hhkKeyboard);
// 安装键盘HOOK
g_hhkKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyHookProc, g_hInstance, 0);
if (!g_hhkKeyboard)
return FALSE;
break;
case FALSE:
UnhookWindowsHookEx(g_hhkKeyboard);
g_hhkKeyboard = NULL;
break;
}
但问题依旧。
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...;
);
CWinApp::ExitInstance里面做.
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
if (g_hhkKeyboard)
{
UnhookWindowsHookEx(g_hhkKeyboard);
g_hhkKeyboard = NULL;
}
break;
}
g_hInstance = (HINSTANCE)hModule;
return TRUE;
}
Type Quantity Deallocator Allocation Location SequenceSetWindowsHookExA 1 UnhookWindowsHookEx EnableKeyboardHook - [Hook.cpp, line 87 (MiniAssist.dll)] 139
Resource Leak Exiting Program: Handle 0x00260553 allocated by SetWindowsHookExA.Allocation Call Stack - Thread 9 [0x050C]
EnableKeyboardHook D:\ycdeng\Mini Assistant\Hook\Hook.cpp 87
LockWindow D:\ycdeng\Mini Assistant\include/UserFunction.h 645
WorkSaveDataProc D:\ycdeng\Mini Assistant\include/ThreadProc.h 857
C:\WINDOWS\system32\kernel32.dll!0x0000b508
╭═══╮ ╭═══╮ ╭══════╮
╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭══╮╰╮
║ ║ ║ ║ ║ ║ ╰╮╰╮
║ ║ ║ ║ ║ ║ ║ ║
║ ║ ║ ║ ║ ║ ║ ║
║ ║ ║ ║ ║ ║ ╭╯╭╯
║ ║ ║ ║ ║ ╰══╯╭╯
║ ║ ║ ║ ║ ╭═══╯
║ ║ ║ ║ ║ ║
║ ║ ║ ║ ║ ║
║ ║ ║ ║ ║ ║
╰╮╰╮ ╭╯╭╯ ║ ║
╰╮╰═╯╭╯ ╭╯ ╰╮
╰═══╯ ╰═══╯
IT者-IT开发者的网站--10万篇技术资料--天天更新--每天都有进步--看了别忘了收藏起来啊。
www.itzhe.cn IT者
“就在工作线程结束时unhook”,似乎无法做到啊?十分感谢!!只能加到100分了...
[email protected]