
好的, 这不是很简单么, 一坨dll copy过去不就行了么. 对, 没错, vs2005之前的确是这样的, 可是vs2005 M$玩出了新花样. copy完之后继续报错, 0x80000003对应的error code的含义是: One or more arguments are invalid. 这不是废话么...:

突然想到项目默认的manifest是我自己加的, 为了支持XP的theme, 这个也有关系? 于是重用vs2005新建了一个mfc程序, 比对生成的binary中的manifest部分, 发现后者多了如下的部分:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>

有是一句废话... 我自己写的程序居然叫我re-install = =b... 诶.. google吧.. 说是vs2005开始, 这些redistributable的dll 会被系统保存在特别的目录下, 以区分同名但事实上不同版本的dll (额额..让我想到那个恼人的COM...). 如下图片:

ei.. 那么长的路径名... 这些目录是装了vs2005的机器就会有的. 显然我们不会要求用户也装那么庞大的东西吧. 于是M$提供了所谓的redistributable package=.=... 本来直接复制不是挺好的么... 下载地址点这里.
恩.. 不光是程序起来的时候会判断crt的路径, dll load的时候也是, 包括调用LoadLibrary()的时候. 而今天碰到的实际问题就是: 程序掉一个dll, dll LoadLibrary一个open source的dll, 而最后那个dll包含的manifest不正确. 啧啧, 用dependency walker喵了很久也看不出来原因好晕, 最后问题果然出在那个3rd party的dll上, 还是逐步比较manifest才发现的, 啧啧.....



