回复 34楼 有容就大
这是偶以前研究vc2005程序发布的一些研究,或许对你有用:
由于2005和2008版本采用了manifest文件进行配置,据说是为了解决DLL Hell问题,(但不知道为什么2010版又取消了这个必要的配置),所以如果直接把生成的EXE文件拷到其它机器上,就会得到一个“应用程序配置不正确,应用程序不能启动”典型的运行错误对话框。参考了网上的一些文章,解决方法就三种,一种是静态链接发布,好像是废话,缺点嘛不用说,EXE,DLL太大。第二种是安装vcredist_x86.exe这个微软提供的VC运行库,MS的网站上这个文件随时都在更新,缺点嘛,只支持Release版,Debug版不支持。第三种,将VC2005安装目录下:VC\redist\Debug_NonRedist\x86 和VC\redist\x86文件夹复制到exe所在的目录下,发布exe,dll时要同时发布对应的manifest文件,例如发布XXXX.EXE就需要XXXX.exe.intermediate.manifest,此文件在编译时会在项目目录里自动生成。
偶测试了一下第三种情况,生成了一个VC Win32 Release版的程序,未用MFC,放进一个干净的XP中,运行,自然是那个经典的出错对话框。然后把相应的文件一一拷到EXE目录中,不错,真的可以运行,似乎还满好的,但仔细一想,Win32程序呀,需要带这么多的运行库么?一共是4.3MB多呢,五个目录中从名字就可以看出来,ATL是用于ATL程序的,CRT是用于C/C++程序库,两个MFC一个是MFC库,另一个是本地语言库,还有一个OPENMP是多处理器库。很明显,看你用什么方法搞开发,就用哪个库。测试了一下偶的这个Win32程序,实际上只需要CRT那个目录就行了。又看了一下据说是一个国外大牛写的文章,直接生成修改manifest来启动当前目录中的运行库,达到避开WiSXS目录中放运行库的目的。
照样测试了一下,那个文章中提到的在manifest中的publicKeyToken属性移除了,如果把Microsoft.VC80.CRT.Manifest中的publicKeyToken移除了,照样出错对话框,也许是大牛的VC版本比我的要高一些吧,好象是升过级的版本。尝试着把Microsoft.VC80.CRT目录下的那个Microsoft.VC80.CRT.manifest或是三个运行库移出来运行,结果均得到另一个“程序初始化错误的”的对话框,有意思,试着将我的App.exe.manifest中的<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' 这里的name属性改成'.'(由DOS想到的.表示当前目录),然后把把Microsoft.VC80.CRT.manifest和三个库文件都移到EXE当前目录中,运行,居然可以,证明了这个猜想是对的。当然,我的程序只用到msvcrt.dll,所以把另两个文件移走,照样可以运行。有趣,无意中又把App.exe.manifest文件移走,发现程序依然可以运行,更加夸张了,这样的话,可以和VC2003程序发布相同了,EXE和运行库在同一个目录下就行了!同样再测试了一下MFC,搞了个最简单的MFC 对话框程序,经过测试发现,如果是默认的UNICODE支持编译,同样可以放在一个目录下运行,只需要mfc80u.dll, msvcr80.dll,两个运行库的manifest加上你的应用程序EXE一共五个文件就行了,无需应用程序的manifest,未打包只有1.67MB,顺手再查看了一下MFC目录下面,有两个居然托管MFC的DLL,到此,情况已经非常理想了,唯一不爽的是不象VC7只需要拷运行库在System32下面,就可以倒处运行程序的情况,2005必须让应用程序跟着运行库走,如果是取消程序项目中的嵌入程序清单这项的话,EXE和运行库的目录也不能变,无法在同一目录下运行了。也许国外的某个大牛修改了VC的CRT+MFC源码重新编译来实现和VC7一样的效果也说不定。不过就测试的过程上来看,MS应该在生成的EXE中加入了读取运行库manifest文件的相关函数代码,如果猜测不错的话,估计也是调用MSXML那个COM接口实现读取manifest判断应用程序运行环境的正确性,难怪不得程序在虚拟机里执行的时候有明显的启动迟钝现象,切,还是VC6,VC7方便快速,但是还是想用VC2005提供的安全运行库函数,只有测试看看有没有办法用VC7链接上VC2005的运行库了。
另一个问题,VC2005生成的Win32程序,如何具有XP Style风格样式呢?2005生成的MFC程序自动就是XP风格样式的程序了,哈,挺方便的,和以前一样,手动添加那个风格文件为24号资源就行了。VS2005自带的SDK是Win 2003 sp1版的。