【发布时间】:2012-01-06 21:32:28
【问题描述】:
我需要禁止带有某些标题的窗口移动。 // Hooks.cpp : 定义 DLL 应用程序的导出函数。 //
#include "stdafx.h"
extern "C" __declspec(dllexport) TCHAR s[50];
extern "C" __declspec(dllexport) HHOOK hHook;
extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
TCHAR s[50];
HHOOK hHook;
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// HDC hdc;
if (nCode < 0)
return CallNextHookEx(hHook, nCode, wParam, lParam);
// hdc = GetDC(hWnd);
CBT_CREATEWND* cbt=(CBT_CREATEWND*)lParam;
if (nCode==HCBT_MOVESIZE)
if (!lstrcmp(s,cbt->lpcs->lpszName)) return 1;
return CallNextHookEx(hHook, nCode, wParam, lParam);
return 0;
}
但是当我移动窗口时出现错误。当我改变它的位置时它改变了,但是我得到了错误 - 在模块 Hooks.dll(我的 dll)中的地址 67471040 的访问冲突。读取地址 00000116
【问题讨论】:
-
你是如何初始化's'的?钩子 DLL 分别加载到每个进程中,因此您不能只在主进程中设置“s”,您必须将值单独传达给每个 DLL 实例,可能使用某种共享内存。我的猜测是这里的 s 未初始化,并且由于这个原因在 lstrcmp 中发生了错误。
-
这是对任何人都无济于事的问题的缩影;由于过于本地化,投票结束。 OP,您只需使用调试器即可解决此问题。
-
如果您认为
s是问题所在,为什么不在实际的 Hook 回调中声明并初始化它,看看是否能解决问题