前段时间一直用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内部,才是比较好的设计