将类放在DLL中,并和共享内存段结合起来使用。
(1)创建一个DLL工程,在cpp中添加如下代码:
//---------------------------------------------------------------------------
#pragma option -zRSHSEG //改变缺省数据段名SHSEG
#pragma option -zTSHCLASS //改变缺省数据类名SHCLASS
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
//__declspec(dllexport) int nType = 0;//导出一个变量,并共享
//---------------------------------------------------------
//导出类,如同一个普通类,成员中不能包含VCL类变量
class __declspec(dllexport) __stdcall systemMem
{
public:
int DatabaseType;//变量必须为public类型
char szUserName[10];
int __stdcall GetType(){return DatabaseType;}//可以导出函数
};
//用上述类来声明一个变量,即共享内存变量
__declspec(dllexport) systemMem pMem={0};//必须初始化,否则无法共享变量
//---------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
编译前,创建一个与工程名相同的,扩展名为.def的文件(可由记事本创建,另存为Unicode格式),添加内容如下:
SEGMENTS SHSEG CLASS 'SHCLASS' SHARED
将此.def添加到工程中。
(2)再创建一个工程,用来测试,添加一个.h文件,包含如下代码。这就是DLL中的共享类的声明部分,仅需声明部分,不需要实现部分。如下:
class __declspec(dllimport) __stdcall systemMem
{
public:
int DatabaseType;
char szUserName[10];
int __stdcall GetType(){return DatabaseType;}
};
__declspec(dllimport) systemMem pMem;//不用初始化
将DLL和对应的lib复制到与测试程序test.exe相同的目录。将lib添加到测试工程中。
现在可以用代码读写pMem变量,可在多个进程中共享数据,如同操作普通类一样。测试时,可以同时运行两份test.exe,一个写,一个读,如果成功,证明共享生效了。
要注意的问题:
1.DLL中的类,成员变量必须为public类型。这一点有点不合常规,成员变量公有,导出函数意义不大了。如果不为public,是无法在DLL中初始化类变量pMem的。
2.DLL中声明的类变量,必先初始化,否则共享不成功
3.共享类的实例变量pMem不能用new初始化,否则共享不成功