下面的这个小程序是在网上看见的,在学习使用后发现,当把数据段mydata的共享属性(“SECTIONS mydata READ WRITE SHARED”)取消后,鼠标钩子就不起作用了(抓不到鼠标的消息了)。请问一下:这是什么原因造成的?
  一般情况下,DLL是数据段为个个进程私有,而代码段为所有进程公有。在下面这个小程序中,我想是可以不使用数据段共享的!
  希望,有这方面经验的朋友,给予指点!谢谢!// MouseHook.cpp : Defines the initialization routines for the DLL.
//#include "stdafx.h"
#include <afxdllx.h>
#include "MouseHook.h"#pragma data_seg("mydata")
HINSTANCE glhInstance = NULL;   // DLL实例句柄
HHOOK glhHook = NULL;     // 安装的鼠标勾子句柄
HWND glhPrevTarWnd = NULL;     // 上次鼠标所指的窗口句柄
HWND glhDisplayWnd = NULL;     // 显示目标窗口标题编辑框的句柄
#pragma data_seg()#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE MouseHookDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
 // Remove this if you use lpReserved
 UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
 {
  TRACE0("MOUSEHOOK.DLL Initializing!\n");
  
  // Extension DLL one-time initialization
  if (!AfxInitExtensionModule(MouseHookDLL, hInstance))
   return 0;  // Insert this DLL into the resource chain
  // NOTE: If this Extension DLL is being implicitly linked to by
  //  an MFC Regular DLL (such as an ActiveX Control)
  //  instead of an MFC application, then you will want to
  //  remove this line from DllMain and put it in a separate
  //  function exported from this Extension DLL.  The Regular DLL
  //  that uses this Extension DLL should then explicitly call that
  //  function to initialize this Extension DLL.  Otherwise,
  //  the CDynLinkLibrary object will not be attached to the
  //  Regular DLL's resource chain, and serious problems will
  //  result.  new CDynLinkLibrary(MouseHookDLL);  glhInstance = hInstance; // 插入保存DLL实例句柄 }
 else if (dwReason == DLL_PROCESS_DETACH)
 {
  TRACE0("MOUSEHOOK.DLL Terminating!\n");
  // Terminate the library before destructors are called
  AfxTermExtensionModule(MouseHookDLL);
 }
 return 1;   // ok
}////////////////////////////////////////////////////////////////////LRESULT WINAPI MouseProc(int nCode, WPARAM wparam, LPARAM lparam)
{
    LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;    if ((nCode >= 0) && (WM_LBUTTONDBLCLK == wparam))
    {
 HWND glhTargetWnd = pMouseHook->hwnd; // 取目标窗口句柄
     HWND ParentWnd = glhTargetWnd; while (ParentWnd != NULL)
 {
     glhTargetWnd = ParentWnd;
     ParentWnd = GetParent(glhTargetWnd); //取应用程序主窗口句柄
 } if(glhTargetWnd != glhPrevTarWnd)
 {
     char szCaption[100];     GetWindowText(glhTargetWnd, szCaption, 100); //取目标窗口标题
     
     if(IsWindow(glhDisplayWnd))
  SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);     glhPrevTarWnd=glhTargetWnd; //保存目标窗口
 }
    }    return CallNextHookEx(glhHook, nCode, wparam, lparam); //继续传递消息
}CMouseHook::CMouseHook()    //类构造函数
{
}CMouseHook::~CMouseHook()   //类析构函数
{
    StopHook();
}BOOL CMouseHook::StartHook(HWND hWnd) //安装钩子并设定接收显示窗口句柄
{
    BOOL bResult = FALSE;
    
    glhHook = SetWindowsHookEx(WH_MOUSE, MouseProc, glhInstance, 0);    if (glhHook != NULL)
 bResult = TRUE;    glhDisplayWnd = hWnd; //设置显示目标窗口标题编辑框的句柄
 return bResult;
}BOOL CMouseHook::StopHook() //卸载钩子
{
    BOOL bResult = FALSE;    if (glhHook)
    {  
 bResult = UnhookWindowsHookEx(glhHook);
 
 if (bResult)
 {
     glhPrevTarWnd = NULL;
     glhDisplayWnd = NULL;//清变量
     glhHook = NULL;
 }
    }    return bResult;
}

解决方案 »

  1.   

    我理解的不深,但我知道可以这样用(自己也用过)。你说的那个HOOK被每个占有焦点的进程所利用(所以作成了DLL),占有焦点的进程必须知道
    HWND glhPrevTarWnd = NULL;     // 上次鼠标所指的窗口句柄
    HWND glhDisplayWnd = NULL;     // 显示目标窗口标题编辑框的句柄这两个变量的值,因此将它们标志为共享变量。
      

  2.   

    如果不作成共享变量的话,当前具有焦点的进程不能理解前一个占有焦点进程的内部变量的值。(因为在WIN32内部进程之间是独立的)
      

  3.   

    谢谢你的回复!看了后,让我感到原来对于dll的理解有点问题!我会在做些验证!
      

  4.   

    ajn_sailing(我心飞翔):“你说的那个HOOK被每个占有焦点的进程所利用(所以作成了DLL),占有焦点的进程必须知道
    HWND glhPrevTarWnd = NULL;     // 上次鼠标所指的窗口句柄
    HWND glhDisplayWnd = NULL;     // 显示目标窗口标题编辑框的句柄这两个变量的值,因此将它们标志为共享变量”想了想,我认为“HWND glhDisplayWnd = NULL;     // 显示目标窗口标题编辑框的句柄”,这个参数值是我的应用程序传入的,不需要其他进程来修改,应该可以不共享的,到是“上次鼠标所指的窗口句柄”需要共享,因为会被其他鼠标双击的事件所改变!