300分向各位高手请教一个有关钩子问题

No9 2000-12-31 12:04:00
请教高手一个问题,最近我想编写了一个小软件,需要使用全局钩子功能,目前已经完成,但却发现一个问题,就是在该软件的窗口中
可以使用,但在其它的窗口上却不能使用!
经多次调试后,发现是一个全局变量(使用的是CPtrArray类变量)的问题,于是输出其地址,发现在不同的窗口中其地址是不相同,
又显示了其成员函数GetSize()的值,果然只有在该软件自己的窗口中才是正确的值(71),其它窗口统统为(0);
我想尽办法,苦战半月,终不知何故,特向各位高手请教一下,如何能够让它们的值相同呢?先谢了!

奇怪,明明我还有接近500分,却只能给221分,不明白!我只能说对不起了!
...全文
669 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
wilston 2001-05-31
  • 打赏
  • 举报
回复
No9
我把我对于内核对象的了解公布如下:
以FileMapping 为例,同时运行两个应用程序实例,通过内核。
一个CreateFileMapping,另外一个可以通过 OpenFileMapping获得数据

服务器
HANDLE hMap = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE,
0, 1024 * 4, "Test");

if (hMap != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox("File Mapping Already Exist!");

CloseHandle(hMap);
hMap = NULL;
return;
}

UpdateData(true);

LPVOID pFile = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);

LPTSTR lpString = (LPTSTR)pFile;
VERIFY(lstrcpy(lpString, this->m_strData) != NULL);
UnmapViewOfFile(pFile);

客户端:
hMap = OpenFileMapping(FILE_MAP_WRITE, false, "Test");
if(hMap == NULL)
{
AfxMessageBox("Open File Mapping Failed!");
return;
}

LPVOID pFile = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);

// strcpy
LPCTSTR lpString = (LPCTSTR)pFile;

int iLength = this->m_strData.GetLength();
LPTSTR lpBuffer = this->m_strData.GetBuffer(iLength);
lstrcpy(lpBuffer, lpString);

UnmapViewOfFile(pFile);
UpdateData(false);
谁需要源代码,请与我联系:wilston@263.net
kkttcsd 2001-05-12
  • 打赏
  • 举报
回复
真是感激不尽,我也正想了解.
No9 2001-01-12
  • 打赏
  • 举报
回复
分数已经奉上,收到了吧,各位!
No9 2001-01-12
  • 打赏
  • 举报
回复
哈哈!问题终于快解决了!现在开始加分!
不好意思,耽误了这么长的时间,可不能以为本人不将信用喲!
首先特别要感谢 eyeblue ,您的方法成功的解决了问题!
同时也要感谢Cloudyshadow,但您所说的Hook32,好像是关于在Win16系统下使用Hook的程序!
同时也要感谢所有回答和关注这个问题的朋友!

另外,我还想问一下,我看MSDN上说要共享对象,需要使用管道或FileMapping,eyeblue也这么说,但它们是这么使用的呢?能说明一下吗?
我另外出100分奉上!问题在 topicview.asp?id=58193 ,请各位抽空拜访并回答一下,谢了!
No9 2001-01-12
  • 打赏
  • 举报
回复
哈哈!问题终于快解决了!现在开始加分!
不好意思,耽误了这么长的时间,可不能以为本人不将信用喲!
首先特别要感谢 eyeblue ,您的方法成功的解决了问题!
同时也要感谢Cloudyshadow,但您所说的Hook32,好像是关于在Win16系统下使用Hook的程序!
同时也要感谢所有回答和关注这个问题的朋友!

另外,我还想问一下,我看MSDN上说要共享对象,需要使用管道或FileMapping,eyeblue也这么说,但它们是这么使用的呢?能说明一下吗?
我另外出100分奉上!问题在 topicview.asp?id=58193 ,请各位抽空拜访并回答一下,谢了!
fengye 2001-01-10
  • 打赏
  • 举报
回复
new(dc)c叫placement new,C++里有这个东西。
这句话不分配内存,只是在你指定的地方(dc)调用对象的构造函数。
iearthshine 2001-01-10
  • 打赏
  • 举报
回复
好长时间没有看这个地方了,呵呵,
那个Hook32 的位置在
Technical Articals/Windows platforms/Windows Management/Win Hooks32/你该看到了
关于Hook的介绍
平台SDK/Windows Base Service/Interprocess Communication/Hooks
No9 2001-01-07
  • 打赏
  • 举报
回复
“new(dc)c”是什么意思?
C++好像没有这种语法呀?
No9 2001-01-07
  • 打赏
  • 举报
回复
哈哈!一个伟大的时刻诞生了!2001-01-07的21:00!
如您所说“如果不初始化,那个数组就不会定义到系统全局堆”,嘿看来这真可能是vc编译器的问题,我将全局数组初始化了一下,果然成功的显示内容了!又学了一招,谢谢,eyeblue!
看来问题快要解决了!
本人决不食言,待问题最后解决后,分数一定会如数奉上的,因为那里面也有您的一份辛苦吗!
CoolHg 2001-01-06
  • 打赏
  • 举报
回复
试一试下面的方法,我没用过,是从一本书上得来的,好象是<Visual C++ 宝典>
class C
{
...
};
#pragma data_seg ("shareddata")
BYTE dc[sizeof(c)];
C* pcc=NULL;
#pragma data_seg()

void InitFun()
{
pcc = new(dc)c;
}
eyeblue 2001-01-06
  • 打赏
  • 举报
回复
如果不初始化,那个数组就不会定义到系统全局堆
这可能是vc编译器的问题。
No9 2001-01-06
  • 打赏
  • 举报
回复
哦,的确我没有初始话元素数组;
但您能告诉我为什么一定要初始化数组呢?
难道仅仅是为了防止使用的内容不正确吗?
还是MS的VC在没有初始化数组时,不分配内存空间呢?
No9 2001-01-06
  • 打赏
  • 举报
回复
安静一下!shyguy 你有什么好笑的,如果你懂,你回答一下好吗,不要笑话人吗!
舟中夜起 2001-01-06
  • 打赏
  • 举报
回复
还是写个驱动吧,简单有效
eyeblue 2001-01-05
  • 打赏
  • 举报
回复
还有,我说过要在定义时就同时初始化数组,你做了吗?
eyeblue 2001-01-05
  • 打赏
  • 举报
回复
1,“我将其CHLEMData类对象g_objHLEMData定义在DLL程序中”
这是错误的,你只能把类定义在DLL里,而不能是类对象。因为进程A通过你的引出函数使用它时,是在A的空间,进程B呢是在B的空间,你在A空间里创建的对象在B或C里当然访问不了。
实在不明白就不要想着用类了,你在钩子函数里的动作能有多复杂?自己管一个List都管不了吗?

2,“输出时其地址值仍然是高位地址不同”
先不要关心地址是否相同,在你的主程序(call LoadLibrary的那个)里把这个数组设成一个字符串,如"Test For Keyboard Hook\0",然后在你的KeyboardProc里把它的值OutputDebugString出来,用SoftIce看看对不对,如果对,那就对了。

lu0是什么人,为什么一定会笑?
No9 2001-01-05
  • 打赏
  • 举报
回复
eyeblue 您说的是什么意思?
我对Windows理解不是太深,我是从DOS下转过来的,如你所说的Windows于DOS的内存管理方法类似,也是由两部分组成的了?
那么又这么保存其段选择符呢?
又有什么不好呢?
shyguy 2001-01-05
  • 打赏
  • 举报
回复
哈哈哈,lu0看了要笑死了.你说呢,lu0?
不过我可笑不出来,好好学习先.
No9 2001-01-05
  • 打赏
  • 举报
回复
我已经走投无路了,今天下午按照您说的方法我试了整整一个下午,还是不行呀!
我试个定义了一个全局的字符数组:
BYTE g_bDataBuf[2048];
输出时其地址值仍然是高位地址不同,所以仍然无法显示其内容!
我应该这么办?
问题可能已经快解决了,请您千万不要放弃呀!帮帮忙吗!
xiaoyuer 2001-01-05
  • 打赏
  • 举报
回复
的确是要用共享数据段
否则的话你的钩子只加载到你的应用程序进程
加载更多回复(28)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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