VC中,动态Release编译和静态Release编译除了编译后程序体积区别
外,还有没有其他重大影响。
  比如:我这里有一个程序,以前的版本采用动态Release编译,客户
那边反应一直没有任何问题,现在程序内容没有进行任何修改,但采用
静态Release编译。但是发布后,客户那边反应程序开始运行弹出访问地址
越界错误造成程序崩溃。不知是何原因。很是头疼。
  另外如果采用动态编译需要在程序安装目录中加入那些连接库才能防止
出现“无法找到动态连接库”错误(以前一些程序采用动态编译出现了此
问题而无法运行)。
  那位高人指点迷津。

解决方案 »

  1.   

    动态就是好多函数要到dll中去找,所以你发布程序要连dll一起发布。
    静态就是把你要用的函数都一起做进exe了,所以只剩一个文件,尺寸也大多了。
    至于访问地址越界,我倒是没见过,
    要说因为文件太大,大到都无法调入内存,或者调入后都无法寻址了,
    那也不至于。
      

  2.   

    可能有些库冲突吧,这种情况不多见.
    动态Release没问题,就不用静态Release的
      

  3.   

    如果采用动态编译,那么需要在安装目录中加入那些dll库来防止
    出现“找不到连接库”问题呢。
      

  4.   

    这个不用死记硬背。
    你只要把exe文件放进一个“干净”的电脑去运行,
    跳出对话框说缺哪个dll,你就把那个复制过去,
    然后又跳出对话框说缺另一个,你再复制过去,
    一般来说MFC程序须要4个,
    要是你用到更多函数,可能要得更多。
      

  5.   

    你的问题70%的可能是指针没有初始化,debug的时候会自动初始化,release则不会,所以出现访问错误
      

  6.   

    bobob(静思--潜心研究PDF)真是英明神武,我查找了一下源代码,原来的源代码是这样的
    (程序中不断的调用和关闭其他可执行程序,这种调用方式很是SB,但是我不想对那些代码
    进行大的修改,因为是别人写的,并且经过了好几拨):
      int COnPracticeXPDlg::StartServiceApp(int iServiceType)
      {
          ……………….
          if(nResult == STATE_OK)
          {
    TerminateProcess(m_CurProcessInfo.hProcess,100);
    CloseHandle(m_CurProcessInfo.hProcess );
    CloseHandle(m_CurProcessInfo.hThread );

    ZeroMemory( &m_CurStartUpInfo, sizeof(m_CurStartUpInfo) );
    m_CurStartUpInfo.cb = sizeof(m_CurStartUpInfo);
    ZeroMemory( &m_CurProcessInfo, sizeo(m_CurProcessInfo) );
    if( !CreateProcess(pCurPath,NULL,NULL,NULL,FALSE,0,NULL, NULL,&m_CurStartUpInfo,&m_CurProcessInfo))
                                    错误提示..........
    ……………….
          }
          说明:m_CurProcessInfo是PROCESS_INFORMATION类型,程序运行,
    m_CurProcessInfo.m_hProcess未赋值,调试时候在CloseHandle(m_CurProcessInfo.hProcess )
    时候发生错误,我怀疑在实践运行的Release中产生的地址越界可能就是在这里出的问题。
          关键是我不想对程序框架做大的修改,怎么修改做好。
          另外在Release版本中,TerminateProcess一个空值会否产生地址越界。也就是说Release
    版本中,对一个未赋值的地址调用该函数有什么样地影响,是否一定要在该函数后调用CloseHandle呢?
          我对该代码进行如下修改,大家提提有无问题:
    BOOL bTerminateProc = TerminateProcess(m_CurProcessInfo.hProcess,100);
             if(bTerminateProc)
             {
       CloseHandle(m_CurProcessInfo.hProcess );
       CloseHandle(m_CurProcessInfo.hThread );
             }
      

  7.   

    m_CurProcessInfo.hProcess 一定是有效的吗?
      

  8.   

    m_CurProcessInfo.hProcess刚开始的时候是无效的,而且以后可能也是无效的
      

  9.   

    还有就是如果一个变量没有赋初值就使用,Debug和Release版本会自己赋初值吗?
      

  10.   

    局部变量需要进行初始化全局变量不需要初始化,int被置0,字符串置空,指针被置NULL(也是0)
      

  11.   

    正常,内存处理不规范,debug的链接库能允许这些,release不行
      

  12.   

    初始化m_CurProcessInfo.hProcess = NULL试试
      

  13.   

    不仅仅是指针。还有个更容易被忽视的地方,就是浮点数。我昨天才遇到个这种问题,一个FLOAT没有初始化,在转成字符串的时候有可能会导致堆栈被破坏,这个应该是wsprintf函数的BUG吧,也许。