DLL导出类共享内存

将类放在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初始化,否则共享不成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值