Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24413
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-28 18:06
文章分类
文章存档

2017年(2)

2016年(5)

2015年(6)

2014年(1)

我的朋友

分类: C/C++

2015-04-30 21:59:04

原文地址:DLL共享内存的基本写法 作者:netrookie

dll.h

#ifdef _cplusplus
#define EXPORT extern "C" _declspec(dllexport)
#else
#define EXPORT _declspec(dllexport)
#endif

EXPORT VOID CALLBACK SetString(PSTR);
EXPORT VOID CALLBACK GetString(PSTR);

上一篇文章已经说过了,基本没有什么不同,关键是实现文件:

#include <windows.h>
#include "dll1.h"

#pragma data_seg("shared")
TCHAR buffer[30] = "我难道不是一个中国人?";
#pragma data_seg()
#pragma comment(linker, "/SECTION:shared,RWS")

int WINAPI DllMain(HINSTANCE hInstance,
                 DWORD fdwReason,
                 PVOID pvReserved) {
    return TRUE;
}

EXPORT VOID CALLBACK SetString(PSTR str) {
    strcpy(buffer, str);
}
EXPORT VOID CALLBACK GetString(PSTR str) {
    strcpy(str, buffer);
}

作者的解释:

第一个#pragma叙述建立数据段,这里命名为shared。您可以将这段命名为任何一个您喜欢的名字。在这里的#pragma叙述之后的所有初始化了的变量都放在shared数据段中。第二个#pragma叙述标示段的结束。对变量进行专门的初始化是很重要的,否则编译器将把它们放在普通的未初始化数据段中而不是放在shared中。

连结器必须知道有一个「shared」共享数据段。在「Project Settings」对话框选择「Link」页面卷标。选中「STRLIB」时在「Project Options」字段(在Release和Debug设定中均可),包含下面的连结叙述:

/SECTION:shared,RWS
        

字母RWS表示段具有读、写和共享属性。或者,您也可以直接用DLL原始码指定连结选项,就像我们在STRLIB.C那样:

#pragma comment(linker,"/SECTION:shared,RWS")
        


阅读(670) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~