DLL中建立进程共享数据段需要注意的语法问题

默认情况下,所有的数据段都是进程独立的,每个进程有自己的一份。但有时候进程共享一个数据段也是有需要的,为此VC++编译连接器提供了专门的语法,下面是一个典型的例子,建立了一个名为Shared的共享数据段,该数据段里只有一个变量g_hwndOwner。

////////////////////////////////////////////// 进程共享区 ///////////////////////////////////////
#pragma data_seg("Shared")
HWND g_hwndOwner = NULL;		// 调用SetWindowsHookEx的线程的主窗口
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws") // 可读,可写,进程间共享。所有加载此dll的进程共享一份内存

看似简单的东西,却往往很容易让我们犯错。下面是几个需要注意的语法问题:

(1)数据段的名称为“Shared”,那么在设置该段属性的时候,一定要保证段名称完全与“Shared”相同,而且大小写敏感。一旦两者不同,连接器会警告错误。

>LINK : warning LNK4039: 用 /SECTION 选项指定的节“Shar2ed”不存在。注意是警告错误,所以DLL文件会继续编译连接成功,只是Shared数据段并没有设置为共享段。

(2)共享段中的变量一定要初始化,否则连接器也会报错,也不能正常设置为共享段。

1>LINK : warning LNK4039: 用 /SECTION 选项指定的节“Shared”不存在。 但是继续生成dll文件。

(3)最后一行中的rws之前不能有空格,否则编译器报错。

1>main.obj : fatal error LNK1276: 找到无效的指令“rws”; 未以“/”开头。然后停止编译连接。

这三种错误,最严重的就是(1)和(2),因为虽然没有成功设置共享段,但是仍然编译成功,稍不注意,就会非常危险。对于(3)则根本不能编译成功,所以只要了解语法修改就可以了,不存在潜在危险。

??

时间: 2024-10-08 13:54:55

DLL中建立进程共享数据段需要注意的语法问题的相关文章

DLL共享数据段

//变量定义,不同Instance共享的该变量 #pragma data_seg("SHARED") static HHOOK hhk=NULL; //鼠标钩子句柄 static HINSTANCE hinst=NULL; //本dll的实例句柄 (hook.dll) #pragma data_seg() #pragma comment(linker, "/section:SHARED,rws") //以上的变量共享哦! 1.#pragma data_seg()一般

VC++共享数据段实现进程之间共享数据

当我写了一个程序,我希望当这个程序同时运行两遍的时候,两个进程之间能共享一些全局变量,怎么办呢?很简单,使用VC\VC++的共享数据段.#pragma data_seg("foo")//建立一个叫“foo”的数据段#pragma comment(linker,"/SECTION:foo,RWS")//设置段foo的属性为“可读可写共享” int bar=0;//这些变量是共享的,不同的进程之间都可以访问到.int bar233=1;int foobar=9;int 

Unity中建立文本保存数据

public void CreateYunYD() { GameToolsManager.Instance.effectType = EFFECTTYPE.YunYD; CreateYunOrWu("Effect/yunwu-yd", Vector3.zero); } public void CreateYunZY() { GameToolsManager.Instance.effectType = EFFECTTYPE.YunZY; CreateYunOrWu("Effec

Python 进程共享数据(数据传输)实例

#coding:utf-8 ''' Created on 2017年11月22日 @author: li.liu ''' import multiprocessing from time import sleep def m1(p,q): while True: for i in xrange(1000): print '发送参数:',i,i+1 p.send(i) q.put(i+1) sleep(3) def m2(p,q): while True: s='接收数据: '+str(p.rec

Linux中的进程 --- fork、vfork、exec函数族、进程退出方式等分析

fork和vfork分析: 在fork还没有实现copy on write之前,Unix设计者很关心fork之后立即执行exec所造成的地址空间浪费,也就是拷贝进程地址空间时的效率问题,所以引入vfork系统调用. vfork有个限制,子进程必须立刻执行_exit或者exec函数. 即使fork实现了copy on write,效率也没有vfork高,但是现在已经不推荐使用vfork了,因为几乎每一个vfork的实现,都或多或少存在一定的问题. fork:子进程拷贝父进程的数据段:vfork:子

进程间通信 - 动态链接库中共享内存(利用DLL的2~3G的地址段空间)

前言 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据,以及其他的一些资源组成.32位系统的进程分配4G的虚拟地址空间.内存地址范围是0x00000000-0xFFFFFFFF.这个内存地址空间是每个进程独立的,也就是说,在一个进程中是不能访问其他进程的地址空间的. 举个例子,进程A的内存里保存了一个数据,假设这个数据的地址是0x33333333.这个是时候,即使把进程B的内存地址是0x33333333的数据读出来.这个数据也和进程A里同地址的数据是不一样的.甚至进程

进程的组织:控制块、程序段和数据段

进程是操作系统的资源分配和独立运行的基本单位.它一般由以下三个部分组成. 进程控制块 进程创建时,操作系统就新建一个PCB结构,它之后就常驻内存,任一时刻可以存取, 在进程结束时删除.PCB是进程实体的一部分,是进程存在的唯一标志. 当创建一个进程时,系统为该进程建立一个PCB:当进程执行时,系统通过其PCB了解进程的现行状态信息,以便对其进行控制和管理:当进程结束时,系统收回其PCB,该进程随之消亡.操作系统通过PCB表来管理和控制进程. PCB通常包含的内容 进程描述信息 进程控制和管理信息

windows核心编程之进程间共享数据

有时候我们会遇到window进程间共享数据的需求,例如说我想知道系统当前有多少某个进程的实例. 我们能够在程序中定义一个全局变量.初始化为0.每当程序启动后就加1.当然我们我们能够借助第三方介质来储存这个变量,然后解析. 这样做必须做到先写入后解析.不能实时更新数据.假设不考虑其它储存介质.仅仅是进程中的通信,应该怎么做呢?windows提供了一些可行的方法,以下介绍经常使用的两种. 一.共享数据段 #include "stdafx.h" #include <Windows.h&

利用内存映射文件在两个进程间共享数据 转

private hMapFile: THandle; MapFilePointer: Pointer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin hMapFile := CreateFileMapping ( $FFFFFFFF, // 特殊内存映射句柄 nil, page_