通过制作一个小软件得到的感悟

每做一个windows项目,都会遇到种种千奇百怪的问题,无论多复杂的问题,最终都能解决,但要不是baidu的帮助和热心网友们解决问题的帖子,其中的一些问题是无法解决的。

我把最近在制作一个小软件过程中遇到的问题记录下来,来看看问题的复杂性。


将同事linux下做的*.c源代码移植到vs2010下,制作windows界面程序。

一.将*.c和*.h文件加入到vs2010工程中。

1.vs2010中无<unistd.h>头文件

2.给*.h下的函数声明加extern "C" {}

3.snprintf(),popen,pclose改为_snprintf,_popen,_pclose,

4.creat(,0755)改为open(,_S_IWRITE|_S_IREAD)

5.open(filename,O_RDONLY)改为open(filename,O_RDONLY|O_BINARY),否则后面无法正确读出文件数据。

6.为了引用方便,static函数去掉static声明。

7.将*.c加入工程后,*.c文件默认是依赖于预编译头文件的,去掉。

8..c文件不支持c++的容器作为函数参数。

二.将所有的动态库依赖改为静态库依赖。

1.将bcgcbpro改为静态库编译

    (1)链接时getsystemmetrics等四个函数找不到,报error2001错误。

            多亏网友的解决方案:

           #pragma warning(disable:4706)
          #define COMPILE_MULTIMON_STUBS
          #include <multimon.h>
          #pragma warning(default:4706)

    (2)改为静态链接mfc库和runtime库

2.将资源动态库改为静态链接(花费了70%)的时间

   这方面的官方资料是最少的,通过网友的方法和自己的摸索,最终解决了问题。

3.将openssl改为静态链接库。

    (1).下载openssl源代码

    (2).下载activeperl

    (3).按照说明文档编译openssl为静态库

    (4)区分lib文件是静态库还是dll的导入库的方法,lib /list *.lib

三.将工程的动态依赖改为静态依赖后遇到的问题

    程序运行后,ListCtrl派生控件的显示出现了乱码,而在动态库下显示是正常的。

   这个问题是最隐蔽的,没有任何头绪,只能一点一点,猜测,修改代码,尝试,周而复始。

   最终发现问题出现在一条语句上面:

   ListCtrlCl::DrawItem()

   {

        .........  

       VERIFY(GetItem(&lvi));//问题语句

       ............

  }

   通过反汇编发现VERIFY(GetItem(&lvi))对应的汇编代码为空,根本没有执行GetItem()函数,

  去掉VERIFY()宏后,即

   ListCtrlCl::DrawItem()

   {

        .........  

       GetItem(&lvi);

       ............

  }

  问题解决。VERIFY(express)是MFC的宏定义,在debug版本下,对表达式express校验,如果express为false,引发程序报错。

  为何VERIFY汇编后汇编代码为空,问题肯定是出在“静态链接MFC库”的事实上,之前的MFC是动态链接的。

  难道是静态链接后宏定义失效?简单求助baidu后没有答案,不想再深究下去了,还有好多工作要做。

 

   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用方法: 1、解压至C:\Program Files目录下(密码:xiaoqing); 2、双击导入注册表C:\Program Files\BCGSoft\BCGControlBarPro\bcgcontrolbarpro.12.00.reg; 3、运行向导C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBProIntegrationWizard.exe。 与其它不同之处: 1、包含完整的源代码、帮助文件; 2、已经对 BCGPAppWizard2005 中的向导进行汉化,在 Visual Studio 2008(2010) 中可使用中文向导 BCGPAppWizard (参考 Visual Studio 2008 原有的中文向导,如果您想学习汉化向导,参考目录是:C:\Program Files\Microsoft Visual Studio 9.0\VC\VCWizards\AppWiz\MFC\Application\templates\2052) 关于静态链接: 1、首先必须在运行向导BCGCBProIntegrationWizard.exe时已经编译静态库; 2、在 Visual Studio 建立项目向导时,选择静态链接即可。 关于使用 Office2007、2010 风格: 如果您使用了这些新风格,必须在项目中包括这些资源,否则 debug 版本启动时会报错(缺少资源,release版本不会提示,但显示不正常),具体有二种方法: 1、直接在“解决方案资源管理器”-“资源文件”中点右键,“添加”-“现有项”,把C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBPro\Styles中所有扩展名为 .rc 的资源包括进来即可。 2、直接在“资源视图”-“您的项目”上点右键,选择“资源包括”,在“资源包括”中的“编译时指令”中的#include "BCGCBPro.rc"后面添加以下代码: #include "C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBPro\Styles\BCGPStyle2007Aqua.rc" #include "C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBPro\Styles\BCGPStyle2007Luna.rc" #include "C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBPro\Styles\BCGPStyle2007Obsidian.rc" #include "C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBPro\Styles\BCGPStyle2007Silver.rc" #include "C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBPro\Styles\BCGPStyle2010White.rc" #include "C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBPro\Styles\BCGPStyleCarbon.rc" #include "C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBPro\Styles\BCGPStyleScenic.rc" 3、如果使用动态库链接,请手工编译C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBPro\Styles\Office2007_styles.sln或者build_all.dsp 仅为学习使用,下载后24小时内删除,请支持 BCGSoft 购买正版,本人不提供技术支持,不对任何负责。 尊重他人劳动成果,欢迎与大家分享成果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值