#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)通知窗口,自己处理接收到的该消息。
//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)通知窗口,自己处理接收到的该消息。
- #pragma data_seg()的使用介绍
- #pragma data_seg介绍
- #pragma data_seg介绍
- #pragma data_seg介绍
- #pragma data_seg介绍
- #pragma data_seg介绍
- #pragma data_seg介绍
- #pragma data_seg() 的使用,进程间的通信
- #pragma data_seg()
- #pragma data_seg
- #pragma data_seg
- #pragma data_seg
- #pragma data_seg
- #pragma data_seg
- #pragma data_seg()
- #pragma data_seg
- #pragma data_seg()
- #pragma data_seg
- HttpClient 教程 (二)
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android开发之:解析plist文件遇到的奇怪问题
- java设计模式-模版方法模式(Template Method)
- rhel上配置apue.h及err_sys出错处理
- #pragma data_seg()的使用介绍
- 独自徘徊的伤感日志:如果有一天,我从你的世界消失了
- linux 管理 suid sgid 用法
- 关於SQL一些常用语句
- Eclipse启动报错:no java virtual machine was found after searching location……
- 创建加载项项目
- 创建加载项项目
- 城里的月光
- 谈谈你对Hibernate的理解。