下面说说在VC6中全局共享数据的实现
在主文件中,用#pragma data_seg建立一个新的数据段并定义共享数据,其具体格式为:
仅定义一个数据段还不能达到共享数据的目的,还要告诉编译器该段的属性,有两种方法可以实现该目的(其效果是相同的),一种方法是在.DEF文件中加入如下语句:
SETCTIONS shareddata READ WRITE SHARED
另一种方法是在项目设置链接选项中加入如下语句:
(4)在Mousehook.app文件的顶部加入#include"Mousehook.h"语句;
(5)加入全局共享数据变量:

#pragma data_seg("mydata")

HWND glhPrevTarWnd=NULL;

//上次鼠标所指的窗口句柄

HWND glhDisplayWnd=NULL;

//显示目标窗口标题编辑框的句柄

HHOOK glhHook=NULL;

//安装的鼠标钩子句柄

HINSTANCE glhInstance=NULL;

//DLL实例句柄

#pragma data_seg()

(6)在DEF文件中定义段属性:

SECTIONS

mydata READ WRITE SHARED

(7)在主文件Mousehook.cpp的DllMain函数中加入保存DLL实例句柄的语句:

DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)


{

//如果使用lpReserved参数则删除下面这行

UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)


{

TRACE0("MOUSEHOOK.DLL Initializing!/n");

//扩展DLL仅初始化一次

if (!AfxInitExtensionModule(MousehookDLL, hInstance))

return 0;

new CDynLinkLibrary(MousehookDLL);

//把DLL加入动态MFC类库中

glhInstance=hInstance;

//插入保存DLL实例句柄

}

else if (dwReason == DLL_PROCESS_DETACH)


{

TRACE0("MOUSEHOOK.DLL Terminating!/n");

//终止这个链接库前调用它

AfxTermExtensionModule(MousehookDLL);

}

return 1;

}


/SECTION:shareddata,rws
好了,准备知识已经学完了,让我们开始编写个全局的钩子程序吧!
由于全局钩子函数必须包含在动态链接库中,所以本例由两个程序体来实现。
1.建立钩子Mousehook.DLL
(1)选择MFC AppWizard(DLL)创建项目Mousehook;
(2)选择MFC Extension DLL(共享MFC拷贝)类型;
(3)由于VC5没有现成的钩子类,所以要在项目目录中创建Mousehook.h文件,在其中建立钩子类:

class AFX_EXT_CLASS Cmousehook:public CObject


{

public:

Cmousehook();

//钩子类的构造函数

~Cmousehook();

//钩子类的析构函数

BOOL starthook(HWND hWnd);

//安装钩子函数

BOOL stophook();

卸载钩子函数

};


#pragma data_seg ("shareddata")

HWND sharedwnd=NULL;//共享数据

#pragma data_seg()
