MFC DLL共享数据段问题

黑川 2014-05-25 12:06:26
编译环境是VC 2012.
在DLL的.CPP中定义里

#pragma data_seg(".Stop ")
//定义你的变量
//CString KeyWord_shar[4][2] = {{"",""},{"",""},{"",""},{"",""}};
//CString KeyWord_shar[2][2] = {{"first","first"},{"first","first"}};

string z = "";
char old_tittle[256] = "\0";
bool full=false;
HHOOK hook = NULL;//全局的HOOK函数。
#pragma data_seg()
#pragma comment(linker,"/section:.Stop,RWS")

也在.def中定义了:
SECTIONS
.Stop READ WRITE SHARED

但是在编译时还是会出现:
1>LINK : warning LNK4039: 用 /SECTION 选项指定的节“.Stop”不存在


完全不知道这是为什么。
在同学的2010上运行也不行。

请问这是和DLL的类型有关吗?
我当初创建工程时选择的是:带静态链接MFC规则的DLL。
...全文
265 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qidongstudy 2014-11-20
  • 打赏
  • 举报
回复
呵呵,看最后楼主的话,显然楼主被各种回答得冒火了。 我没有用2012,用的是2010,但我这边是完全没有问题的。 6楼中出现的问题,应该是你引发的冲突问题了,Cstring这个类,有多个定义的。我一般是使用atlstr.h。不需要定义为在静态库中使用MFC。我使用的是WIN32 DLL工程,一般来说,不需要界面,就使用WIN32工程方便些 共享数据段,要知道的是明确的空间,所以不要用高级类了 #pragma data_seg("USER_SEG") ULONG g_ulPid[1024] = {0}; int g_nPidCount = 0; CHAR wsDecryptProcess[100] = {0}; #pragma data_seg() #pragma comment(linker,"/SECTION:USER_SEG,RWS")
黑川 2014-05-29
  • 打赏
  • 举报
回复
结贴前顺便说一下。 网络上会有各种解决方案。 没有初始化,这个一般是主要的原因。 说大小写有问题的纯属扯淡。 说初始化为零的也是瞎说,string初始化为0和初始化为NULL,你怎么判断哪个是0?你说NULL是0,好。我问你为什么int不能初始化为0?汇编的时候都是数字,都占用了内存的空间。机器没那么智能,专门判断你初始化的是不是0…… 共享数据段内不要放vector这种动态分配内存的数据结构。 一般来说,主流的方法都尝试过了,就说明是某些配置有问题了。考虑从配置入手解决。
黑川 2014-05-29
  • 打赏
  • 举报
回复
问题解决了。 解决方法: 重新开启DLL工程,选择第三个,extern DLL,搬移代码。 之前选的是第二个的MFC DLL然后会出现莫名其妙的传参错误: 1>test_gettext_exeDlg.obj : error LNK2019: 无法解析的外部符号 "void __cdecl Get_BanUrl(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >,int) " (?Get_BanUrl@@YAXV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@H@Z),该符号在函数 "public: void __thiscall Ctest_gettext_exeDlg::OnBnClickedButton2(void)" (?OnBnClickedButton2@Ctest_gettext_exeDlg@@QAEXXZ) 中被引用 当时解决了这个问题,更改了IDE的配置,项目=>属性=>配置属性=>常规=>MFC的使用=>在静态库中使用MFC。 之后写共享数据段就会出现问题。
黑川 2014-05-25
  • 打赏
  • 举报
回复
引用 1 楼 mLee79 的回复:
你这些都初始化为0的, 会被放到 .bss 段..
我之前试过: #pragma data_seg(".Stop ") string z = "hello world"; #pragma data_seg() #pragma comment(linker,"/section:.Stop,RWS") 还是会出现 1>LINK : warning LNK4039: 用 /SECTION 选项指定的节“.Stop”不存在 这个问题
mLee79 2014-05-25
  • 打赏
  • 举报
回复
你这些都初始化为0的, 会被放到 .bss 段..
黑川 2014-05-25
  • 打赏
  • 举报
回复
引用 4 楼 my3439955 的回复:
1、共享节用#pragma 。。。rws的方式已足够,不需要鞋def文件里的什么东西 2、共享节里的全局变量要保证已初始化 3、最好不要共享全局对象,而是用c类型,字符串可以用char [],而char*、string、CString都不一定行
唉,我尝试过只用int i = 0; 还是生成不起来TLT……
  • 打赏
  • 举报
回复
1、共享节用#pragma 。。。rws的方式已足够,不需要鞋def文件里的什么东西 2、共享节里的全局变量要保证已初始化 3、最好不要共享全局对象,而是用c类型,字符串可以用char [],而char*、string、CString都不一定行
黑川 2014-05-25
  • 打赏
  • 举报
回复
引用 1 楼 mLee79 的回复:
你这些都初始化为0的, 会被放到 .bss 段..
这么说吧,其实想要使用共享代码段,是因为发现hook的回调函数没有办法使用全局变量,请问有什么办法能向HOOK的回调函数传参吗?

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧