VS 2010 C++ ,写了一个全局的键盘钩子keyhook.dll,然后通过控制台程序调用;在keyhook.dll中导出......

VS2010C++,写了一个全局键盘钩子keyhook.dll,然后通过控制台程序调用;在keyhook.dll中导出了全局变量exitflag,但是在控制台程序只可以得... VS 2010 C++ ,写了一个全局键盘钩子keyhook.dll,然后通过控制台程序调用;在keyhook.dll中导出了全局变量exitflag ,但是 在控制台程序只可以得到exitflag的初始值,不可以得到 keyhook.dll处理后exitflag的值,程序部分代码如下:
//keyhook. h
#include <Windows.h> //对dll中的导出函数进行声明#define DllExport _declspec(dllexport)
extern DllExport int exitflag; //导出的全局变量,
....

//keyhook.cpp
extern int exitflag=1; //dll导出的变量
.....
case VK_F1:
if(ctrlflag==1 && altflag==1) //ctrlflag=1表示ctrl是按下状态,altflag=1表示alt是按下状态;
exitflag=0;
.....

问题是,我调试的时候,在dll中,exitflag在我按下ctrl+alt+F1后,确实为0,但是在 调用dll的控制台程序中,该值一直是1?急................
Dll的入口函数,不在keyhook.cpp中,在dllmain.cpp中,但是,由于是一个键盘 钩子,所以,不能把
case VK_F1:
if(ctrlflag==1 && altflag==1) //ctrlflag=1表示ctrl是按下状态,altflag=1表示alt是按下状态;
exitflag=0;
放置在 dll的入口函数中............
在线等...............
(我试了一下,好像只有在dll的入口函数中,才可以改变导出的全局变量exitflag的值,不知道是不是这样?如果这样的话,我怎么才可以把exitflag的值传递给 控制台主程序???????????????????????????)
展开
 我来答
匿名用户
2012-10-10
展开全部
DLL虽然会映射到所有进程中,但是其数据段(就是存放全局变量和静态变量的段)在每个进程中都会各自拷贝一份的,除非是共享数据段,所以就出现这种情况。
你的问题就是多进程中如何共享数据,除了共享数据段,还有映射文件,再复杂点,你还可以用消息通知或网络通信去控制另一个进程,或者直接读写另一进程地址空间。
但你这个问题,共享数据段就是最简单也最好用的方法。
匿名用户
2012-10-08
展开全部
如果确定主控制台是直接读取的dll中的exitflag的值话,问题确实挺匪夷所思的。可以试试让dll函数返回值或者把控制台的变量地址传递给dll函数。
更多追问追答
追问
因为参数exitflag的值是在 回调函数keyboardproc中设置的,好像不能够通过回调函数keyboardproc改变这个全局变量exitflag的值 ;
你所说的,把 控制台变量地址传递给dll函数,怎么实现?

我认为,Keyboardproc是把全局变量exitflag的值copy了一份,然后重新分配的地址,和全局变量的地址是不一致的,所以,我觉得只要能把回调函数中exitflag的值,传回给全局变量,就没有问题了,能帮我看看怎么搞吗?多谢
追答
//keyhook.cpp
extern int exitflag=1; //这不是导出的dll导出的变量,这样的方式是定义一个全局变量,并赋值为1
改为:extern "C" __declspec(dllimport) int exitflag;//这是声明dll导出的变量。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式