BCB直接在DLL中定义共享内存单元的步骤如下:
假设DLL的工程名为MouseHook.bpr(编译后产生MouseHook.DLL)
1.在一程序模块 Unit1.cpp的最前面加上:
#pragma option -zRSHSEG // 改变缺省数据段名
#pragma option -zTSHCLASS // 改变缺省数据类名
则该模块内定义的全局变量都将是DLL共享的,但DLL有其它程序模块(Unit2.cpp等),则其它模块中的全局变量仍是非共享的,如果也要共享,则同样须在第二个模块的最前面加 上类似的两行语句,你甚至可以换一个数据段名和类名,如:
#pragma option -zRSH2SEG // 改变缺省数据段名
#pragma option -zTSH2CLASS // 改变缺省数据类名
2.新建一与工程同名 但类型为 .def 的纯文本文件,本例是MouseHook.def, 并 将此文件MouseHook.def用Project->Add Project增加到工程中;其内容要求把上面用到的每一
数据段名与类名说明成共享SHARED,例如对于第一模块Unit1.cpp,需在MouseHook.def中加上一行:
SEGMENTS SHSEG CLASS 'SHCLASS' SHARED
若第二个模式也定义了一个不同的段名与类名,则再加上一 行:
SEGMENTS SH2SEG CLASS 'SH2CLASS' SHARED
3.注意:若定义了一个共享的指针变量,则用new为其申请的内存块仍是局部的,局部内存单元是不能被共享访问的,否 则会出现无效访问,同样地,DLL中若有窗口模块,只能是局部窗口;
// 下面的程序将产生有三个导出函数的MouseHook.DLL
// 纯文本文件 MouseHook.def的内容如下:
// SEGMENTS SHSEG CLASS 'SHCLASS' SHARED
#pragma option -zRSHSEG // 改变缺省数据段名
#pragma option -zTSHCLASS // 改变缺省数据类名
#include <windows.h>
#pragma argsused
// 以下都将是共享区内存变量
POINT MouseLoc={0,0}; // 存放鼠标位置
HHOOK NewHook=NULL; // 存放新钩子句柄
int LoadCount=0; // DLL装入次数计数
HINSTANCE DllHinst;
假设DLL的工程名为MouseHook.bpr(编译后产生MouseHook.DLL)
1.在一程序模块 Unit1.cpp的最前面加上:
#pragma option -zRSHSEG // 改变缺省数据段名
#pragma option -zTSHCLASS // 改变缺省数据类名
则该模块内定义的全局变量都将是DLL共享的,但DLL有其它程序模块(Unit2.cpp等),则其它模块中的全局变量仍是非共享的,如果也要共享,则同样须在第二个模块的最前面加 上类似的两行语句,你甚至可以换一个数据段名和类名,如:
#pragma option -zRSH2SEG // 改变缺省数据段名
#pragma option -zTSH2CLASS // 改变缺省数据类名
2.新建一与工程同名 但类型为 .def 的纯文本文件,本例是MouseHook.def, 并 将此文件MouseHook.def用Project->Add Project增加到工程中;其内容要求把上面用到的每一
数据段名与类名说明成共享SHARED,例如对于第一模块Unit1.cpp,需在MouseHook.def中加上一行:
SEGMENTS SHSEG CLASS 'SHCLASS' SHARED
若第二个模式也定义了一个不同的段名与类名,则再加上一 行:
SEGMENTS SH2SEG CLASS 'SH2CLASS' SHARED
3.注意:若定义了一个共享的指针变量,则用new为其申请的内存块仍是局部的,局部内存单元是不能被共享访问的,否 则会出现无效访问,同样地,DLL中若有窗口模块,只能是局部窗口;
// 下面的程序将产生有三个导出函数的MouseHook.DLL
// 纯文本文件 MouseHook.def的内容如下:
// SEGMENTS SHSEG CLASS 'SHCLASS' SHARED
#pragma option -zRSHSEG // 改变缺省数据段名
#pragma option -zTSHCLASS // 改变缺省数据类名
#include <windows.h>
#pragma argsused
// 以下都将是共享区内存变量
POINT MouseLoc={0,0}; // 存放鼠标位置
HHOOK NewHook=NULL; // 存放新钩子句柄
int LoadCount=0; // DLL装入次数计数
HINSTANCE DllHinst;