DLL共享数据段,实现多进程数据共享总结

    前段时间一直用WM_COPYDATA消息实现进程数据通信,这次软件升级想学习一下,DLL共享数据段应用,因为这个比共享内存简单一些,向VCKBASE前辈请教了很多,最后明白了下面的点滴

问题简述

假想通过DLL实现进程数据共享?

实现

第一步:在DLL.CPP文件中定义共享数据段

#pragma data_seg("SHARED_OPCDATASET")

/* volatile */ OPCDATASET  m_gOPCDATASET[OPCDATASET_MAX_LEN] = {0};

#pragma data_seg()

#pragma comment(linker,"/SECTION:SHARED_OPCDATASET,RWS")

 

/*

如果没有初始化可尝试执行下面的操作

 _declspec(allocate("SHARED_OPCDATASET")) OPCDATASET m_gOPCDATASET[OPCDATASET_MAX_LEN];

*/

第二步:将共享段变量导出

extern  "C"

{

//导出共享段变量

OPCDATASET_API OPCDATASET extern m_gOPCDATASET[OPCDATASET_MAX_LEN];

}

第三步:在不同进程中调用

#include "OPCDataSet.h"

#pragma comment(lib, "COPCDataSet.lib")

      //A进程: 向共享段写数据

char OPCDataBuffer[56] = {0};

m_gOPCDATASET[0].dVal = FormatVarVal(pVar, OPCDataBuffer);

FILE * fp = fopen("d://Set.txt", "a");

fprintf(fp, "%f", m_gOPCDATASET[0].dVal);

fclose(fp);

      //B进程: 从共享段读数据

FILE * fp = fopen("D://get.txt", "a");

fprintf(fp, "%f", m_gOPCDATASET[0].dVal);

fclose(fp);

注:这些进程最好是与你的DLL放于同一目录下,或将你的DLL放入system32目录下

精彩指导选编:

回复人: vc_student (进士)  2009-8-19 9:45:56

可以通过dll导出一个函数专门操作共享内存呀!

只有一个进程对这个空间进行写操作,其它多个进程是只读,还用做同步吗?

回复人: vc_student (进士)  2009-8-19 9:50:28

要不写到一半别人去读怎么办?

回复人: 幸福的鬼 (书童)  2009-8-19 10:03:57

同步处理是肯定要的,但是关键代码段是不能跨进程的!!!

回复人: vc_student (进士)  2009-8-19 10:04:29

哈,想起来了,关键代码段好像不支持多进程?

回复人: vc_student (进士)  2009-8-19 10:09:46

可以使用互斥对象和事件对象

回复人: folklore (进士)  2009-8-19 10:34:26 

因为你根本就没有真正共享,要真的共享,请使用Mmap,谢

回复人: 幸福的鬼 (书童)  2009-8-19 10:39:59 

这样的软件设计,强

对共享段的访问应该封装在DLL内部,才是比较好的设计

 

你可能感兴趣的:(api,File,System,dll,FP,linker)