MyShareDll.rar

  • PUDN用户
    了解作者
  • Visual C++
    开发工具
  • 12KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 3
    下载次数
  • 2008-12-23 16:22
    上传日期
共享内存是实例,一个简单的内存操作实例。
MyShareDll.rar
  • MyShareDll
  • shrdata.c
    1.9KB
  • ShareDll.ncb
    41KB
  • ShareDll.plg
    1.5KB
  • shrdata.h
    256B
  • ShareDll.opt
    47.5KB
  • ShareDll.dsp
    4.2KB
  • ShareDll.dsw
    539B
  • shrdata.txt
    4.8KB
  • shrdata.def
    207B
  • www.pudn.com.txt
    218B
内容介绍
Windows NT下进程间使用DLL共享数据 加入日期:2004-3-23 浏览选项: 字体:大 中 小 出处:电脑报 在Window 3.x 或Window 95这样的16位操作系统中动态连接库DLL有自己的数据段,当DLL中的函数使用LocalAlloc函数申请内存时,可满足此申请的内存由DLL数据段获得,这种设计使进程间很容易地共享数据,例如一个进程调用DLL的函数分配内存并存入数据,内存句柄存入全局变量,而另外一个进程使用此句柄,锁定那块内存就可取出前一进程存入的数据。这种进程间的共享数据方式看上去挺简单明了的,但是在Windows NT这样的32位操作系统中是无法实现的。这是因为当一进程装入DLL时,系统把DLL的数据和代码映射到此进程的地址空间,DLL的函数的内存申请都是从此进程的地址空间为其分配的,任何其他内存无权访问这块内存。另外,理论上讲如果两个进程使用同一DLL,DLL的代码被装入内存一次而映射到两个进程各自的地址空间内,每个进程有自己的一套DLL全局和静态变量。那么在Windows NT下如何在进程间使用DLL共享数据呢,有一种方法可以实现就是在DLL中建立共享数据区段:   显式区段安装指令可以被放在DLL的入口,要做到这一点需请求区段名称,编译器的编译指令data_seg 用于此请求,编译说明如: #pragma data_seg(”.sdata),一旦此数据段被命名,它就可作为共享数据用 SECTIONS .sdata READ WRITE SHARED 形式进行显式连接。具体程序如下: shrdata.h #ifndef shrdata_h #define shrdata_h USHORT APIENTRY Init(void); USHORT APIENTRY WriteData(unsigned char * inbufptr, USHORT buflen); USHORT APIENTRY ReadData(unsigned char * outbufptr, USHORT * buflen); #endif /* shrdata_h */         shrdata.def LIBRARY shrdata DESCRIPTION '*******' CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE HEAPSIZE 1024 SECTIONS .sdata READ WRITE SHARED EXPORTS Init WriteData ReadData   shrdata.c /**********************************/ /* SHRDATA.C */ /* 进程间共享数据 */ /* 乔良树 */ /* 1999.09.04 */ /*********************************/ #include #include "shrdata.h" #define DataMutexName "shrdata_MUTEX" #define Err_Mutex 0x1000 #define Err_BufLen 0x1001 #define Max_BufLen 1024 //--------------------------------------------------------------------- // 全程变量 //--------------------------------------------------------------------- #pragma data_seg(".sdata") USHORT DataBufferLen=0; UCHAR DataBuffer[Max_BufLen]={'a'}; #pragma data_seg()   /* ------------------------------------------------- * Name: Init * Function: 创建互斥量以避免共享冲突 * Input: NO * Return: 0 - OK * else error code * ------------------------------------------------- */ USHORT APIENTRY Init(void) { HANDLE hMutex; hMutex=CreateMutex(NULL,FALSE,DataMutexName); //创建互斥量 if(hMutex==NULL) return Err_Mutex; return 0; } /* ------------------------------------------------- * Name: Write * Function: 写入共享数据 * Input: * Return: 0 - OK * else error code * ------------------------------------------------- */ USHORT APIENTRY WriteData(unsigned char * inbufptr, USHORT buflen) { HANDLE hMutex; if (buflen>Max_BufLen) return Err_BufLen; if( (hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,DataMutexName)) == NULL ) return Err_Mutex; WaitForSingleObject(hMutex,INFINITE); memcpy( DataBuffer, inbufptr, buflen ); DataBufferLen=buflen; ReleaseMutex(hMutex); CloseHandle(hMutex); return 0; } /* ------------------------------------------------- * Name: ReadData * Function: 读出共享数据 * Input: * Return: 0 - OK * else error code * ------------------------------------------------- */ USHORT APIENTRY ReadData(unsigned char * outbufptr, USHORT * buflen) { HANDLE hMutex; if( (hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,DataMutexName)) == NULL ) return Err_Mutex; WaitForSingleObject(hMutex,INFINITE); memcpy( outbufptr, DataBuffer, DataBufferLen ); *buflen=DataBufferLen; ReleaseMutex(hMutex); CloseHandle(hMutex); return 0; }   下面的程序用来测试此DLL test0.c //写入数据 #include #include #include "..\shrdata.h" void main () { USHORT rc; unsigned char inbuf[2]={"AB"}; USHORT i_buflen=2; rc=Init(); if (rc) return; for (;;) { rc=WriteData( inbuf, i_buflen); if (rc) return ; printf("\nwrite data over\n"); inbuf[0]=inbuf[0]+1; Sleep(500); } }   下面的程序用来测试此DLL test.c //读出数据 #include #include   #include "..\shrdata.h" void main () { USHORT rc; unsigned char outbuf[1024]; USHORT o_buflen=0,i; for (;;) { rc=ReadData( outbuf, &o_buflen); if (rc) return; for (i=0;i<O_BUFLEN;I++) printf("%c",outbuf[i]); printf("\n"); Sleep(500); } }   把shrdata.dll、test0.exe、test.exe放入同一目录,在Windows NT下启一个DOC模式运行test0.exe它不断的把数据写入DLL共享数据区, 启另外一个DOC模式运行 test.exe它会从DLL的共享数据区读出test0.exe写入的数据并显示出来。(注:DLL中为防止数据区共享冲突启用了互斥量)。 作者:乔良树
评论
    相关推荐