DLL中的全局变量。求高手帮助。

betterwxf 2006-09-30 05:02:24
我在我的一个键盘钩子中设置了一个全局变量bool FRUN,在DllMain中令它为false
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if( nCode >= 0 )
{
if( wParam == 0X79 )//当按下F10键时,使它变为TRUE
{
FRUN=true;
keybd_event(69,MapVirtualKey(69,0),0,0);
keybd_event(69,MapVirtualKey(69,0),KEYEVENTF_KEYUP,0);//打出字母E,做测试用
}
}
return CallNextHookEx( glhHook, nCode, wParam, lParam );
}
我把这个DLL中的全局变量传给主程序,我主程序中我写了这句extern bool _declspec(dllimport) FRUN;令主程序只有当FRUN为真时时才激活,可在游戏中,我按F10却没有把主程序激活,而我却看到有字母E出现,不知道是怎么回事,求救高手,我只有那么多了,全给了。
...全文
145 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
betterwxf 2006-09-30
  • 打赏
  • 举报
回复
在游戏中全局钩子可以打出E字说明行啊。为什么没有把FRUN=true传递过去啊,而在主程序处与当前窗口时又行!
betterwxf 2006-09-30
  • 打赏
  • 举报
回复
这个问题解决了,但是我现在又发现了另外一个问题哦,我进入游戏后按F10还是不会响应,但E可以打出来,在WINDOWS窗口测试当主程序处于活动状态时,按F10有反应,也就是说FRUN为true,当失去活动状态时也不行,现在该怎么办啊,高手请指教,分我可以给你加。。。。。。。。。。。。
betterwxf 2006-09-30
  • 打赏
  • 举报
回复
现在行了。的确是这样的,进去后按F10也不卡了,多谢。。。。。。。。。。。。。。。。。。。。。。。。。。。。
rickerliang 2006-09-30
  • 打赏
  • 举报
回复
引用一下msdn的原文:
Win32 DLL 映射到调用进程的地址空间中。默认情况下,每个使用 DLL 的进程都有自己的所有 DLL 全局变量和静态变量的实例。如果 DLL 需要与它的由其他应用程序加载的其他实例共享数据,则可使用下列方法之一:

使用 data_seg 杂注创建命名数据节。
使用内存映射文件。请参见有关内存映射文件的 Win32 文档。
以下是一个使用 data_seg 杂注的示例:

#pragma data_seg (".myseg")
int i = 0;
char a[32]n = "hello world";
#pragma data_seg()
data_seg 可用于创建新的命名节(在此示例中为 .myseg)。为清楚起见,最典型的用法是调用数据段 .shared。然后必须在 .def 文件中或者使用链接器选项 /SECTION:.MYSEC,RWS 为这个新的命名数据节指定正确的共享属性。

在使用共享数据段之前要考虑下列限制:

必须静态初始化共享数据段中的所有变量。在上面的示例中,i 初始化为 0,而 a 是初始化为“hello world”的 32 个字符。
所有共享变量放在编译 DLL 的指定数据段中。很大的数组可产生很大的 DLL。对于所有已初始化的全局变量都是如此。
永远不要将特定于进程的信息存储在共享数据段中。大多数 Win32 数据结构或值(如 HANDLE)仅在单个进程的上下文内才真正有效。
每个进程都将获取它自己的地址空间。永远不要将指针存储在共享数据段包含的变量中,这一点很重要。指针可能在某个应用程序中完全有效,但在另一个应用程序中却无效。
DLL 本身有可能加载到每个进程的虚拟地址空间中的不同地址。具有指向 DLL 中的函数或指向其他共享变量的指针是不安全的。
rickerliang 2006-09-30
  • 打赏
  • 举报
回复
第二个#pragma写错了
应该是
#pragma data_seg()
rickerliang 2006-09-30
  • 打赏
  • 举报
回复
DLL的全局变量是进程私有的,不能在进程间共享
要想在进程间共享内存变量,你可以用
#pragma data_seg("shared")
//你要共享的数据
#pragma data_set()
//在加上连接器选项
#pragma comment(linker,"/SECTION:shared,RWS")
再用导出函数对共享数据进行读写

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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