扩展 DLL资源冲突问题

本文原创,转载请注明出处:http://blog.csdn.net/banket004

平时比较少把对话框之类的资源打包到DLL中,基本都是放一些逻辑算法,所以感觉用起来也顺手,没多少难度.这几天特地把一些项目进行优化,其中需要把一个带对话框的功能模块化,随即轻车熟路的用VS 2010创建DLL解决方案.随着功能的完善,问题立马出来了.

因为之前对要模块化的功能已经修改过N次了, 所以没花多少时间就把相应代码迁移到DLL解决方案中. 稍微更正几个编译不通过的小错误, DLL 就在测试程序上面跑起来了. 但跑了一半却崩溃了, 直接在用GetDlgItem函数获取对话框上指定控件的指针代码处挂掉了. 一开始没什么头绪, 对话框上控件的ID号没错, 应该不会出现这种怪异的现象. 经过断点跟踪, 竟然发现取不到控件的指针, 真的是奇了. 由于GetDlgItem是在对话框的OnInitDialog函数中调用, 用来自定义显示, 因此也看不到对话框弹出来后的效果.  把GetDlgItem相关的代码注释掉后, 再次运行测试程序. 看到弹出来的对话框后, 真是大吃一惊, 这哪里是原来对话框, 根本就是测试程序的界面. 看来很可能是这两个资源的ID号相同.打开各自的Resource.h文件一看,还真的是一样. 这是赤裸裸的资源冲突啊. 看来在DLL加载资源方面,我还是新手, 赶紧问问google. google就是比某度好用, 答案很快就出来了.原来资源默认是查找APP中的资源,找不到才去DLL中找, 要是想在DLL 中用DLL 的资源,需要切换到DLL的资源.感觉有点印象,是以前看过的知识,没用就忘了. 在给各个需要的接口中加入AFX_MANAGE_STATE(AfxGetStaticModuleState( ))之后, 编译出现以下错误:

mfcs100d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in dllmain.obj

又是一个新面孔的家伙,直接把全部错误信息贴到上google找, 找到的答案基本是下面这些情况

mfcs80.lib(dllmodul.obj) :error LNK2005: _DllMain@12 already defined in MSVCRT.lib(dllmain.obj).

后来把搜索关键词简化之后, 找到的网页跟我的情况也相关太大, 尝试着一些方法后, 问题还是没解决.

后来想想,这个是扩展 DLL, 可能比网上说的其他两类DLL的解决方法差别比较大吧. 或者以 "MFC 扩展DLL 使用资源" 为关键词搜到的答案参考价值大些.果然,  一搜索,msdn的网页就排在很靠前面了, 

http://msdn.microsoft.com/zh-cn/library/h5f7ck28%28v=vs.90%29.aspx

这网站的文章对我说是相当滴有用,以前有找到过上面的文章.

看完这文章之后,按照上面的方法,使用AfxGetResourceHandleAfxSetResourceHandle纯手动切换资源, 问题就全部解决了.

虽然做VC开发也有些年月了,以为基本的都能轻松搞定.看来是有点高估了.仍需大大滴努力 :-)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
扩展DLL(即动态链接库文件)是指在已有的DLL主程序基础上增加新的函数或功能。这样可以在不修改原有DLL主程序的情况下,通过添加新的函数来满足更多需求。 要扩展DLL主程序的函数,可以按照以下步骤进行: 第一步,了解DLL主程序的结构和功能。理解主程序的功能和各个模块之间的关系,以便在扩展时保持代码的一致性。 第二步,根据需求设计新的函数。根据扩展的目的,确定新函数的输入、输出参数、返回值等信息。确保函数设计合理和与现有功能兼容。 第三步,创建新的函数实现。在一个新的源文件中编写新函数的具体实现代码,并确保使用正确的调用约定和参数传递方式。 第四步,修改DLL主程序的头文件。将新函数的声明添加到DLL主程序的头文件中,以便其他程序可以调用新功能。 第五步,重新编译和链接DLL主程序。使用编译器将新的源文件与原有的DLL源代码进行编译,生成新的DLL文件。 第六步,测试和调试。将新的DLL文件及其头文件和相应的示例程序一起进行测试和调试,确保新函数的正确性和可用性。 通过以上步骤,我们可以扩展DLL主程序的功能,增加新的函数来满足更多需求。值得注意的是,扩展DLL主程序时,需要谨慎处理函数之间的依赖关系,避免引入不必要的冲突或错误。同时,为了提高代码的可读性和可维护性,建议在扩展时添加适当的注释和文档说明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值