#pragma data_seg()的使用介绍

来源:互联网 发布:java static 多线程 编辑:程序博客网 时间:2024/06/09 22:51
#pragma data_seg()一般用于DLL中。在DLL中测试如下代码:
//edrlib.h
#ifndef _H_H_EDRLIB_H_H_
#define _H_H_EDRLIB_H_H_

#ifdef __cplusplus
extern "C"
{
#endif

#define EXPORT _declspec(dllexport)

EXPORT int GetValue();
EXPORT void SetValue(int val);

#ifdef __cplusplus
};
#endif

#endif

//edrlib.cpp
#include <Windows.h>
#include "edrlib.h"


#pragma data_seg("share")
int g_Value = 0; // 共享数据必须初始化
#pragma data_seg()
//告诉链接器有一个名称为share的共享数据段,RWS表示具有读、写和共享属性
#pragma comment(linker,"/SECTION:share,RWS")

BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason,    // reason for calling function
LPVOID lpvReserved // reserved
)
{
    return TRUE;
}

int GetValue()
{
    return g_Value;
}

VOID SetValue(int val)
{
    g_Value = val;
}

然后启动两个进程A和B,A和B都调用了这个DLL,假如A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值一定是5。从而实现了跨进程之间的数据通信。
备注1:如果g_Value忘记初始化,编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。
备注2:创建一个窗口,初始化时使用RegisterWindowMessage注册一个消息msg,当SetValue调用后可以用过PostMessage(HWND_BROADCAST, msg, 0, 0)通知窗口,自己处理接收到的该消息。

原创粉丝点击