今天一个奇怪的问题,折磨了我跟朋友几个小时。经过九九八十一难之后,终于发现,原来这是灵异事件--传个文件都不省心!
我跟朋友的操作系统都是win7 x64,安装的都是VS 2012 RC和VC++ 2010 express,以及opencv 2.4.2。朋友用vc++写了一个OpenCV的hello world,采用的是其x64的dll,也编译为x64代码,但是死活运行不起来。一运行就报错:
据说,该错误代码0xc000007b表示:STATUS_INVALID_IMAGE_FORMAT. 按我的经验来说,这是因为64位的程序调用了32位的库。
我让朋友把生成的exe文件发过来,在我这边运行却完全正常。
MSVCP100D.DLL和MSCVR100D.DLL
为了搞清楚该程序到底依赖了哪些DLL,请出DependencyWalker神器。朋友发过来了截图:
原来少了这个文件!
下面的灵异故事就围绕着这个MSCVR100D.DLL和它的兄弟MSCVP100P.DLL展开。
Everything出场
我打开Everything,输入MSVCP100D.DLL,结果如下:
可以看到,在System32和SysWOW64下,各有一个。它们大小相同,修改时间也一样,所以我以为它们是一样的。
然后实际上呢?看这里:
System32下的大小,实际上是991K!而且修改日期也不是12:15。
此为灵异事件1。如果仅仅如此,不算是灵异事件,而应该算是Everything的BUG了。
QQ出场
我把System32下的msvcp100d.dll拉到QQ上,向朋友发送过去。奇怪的是,我明明拉的是991K的这个,但它显示的都是726K的这个!
由于我从来没想到QQ竟然会在中间狸猫换太子,还以为发送的就是991K的那个呢。
然而朋友拷过去后,运行程序还是出错。我们只好把目光再次集中在程序代码、环境变量设置等问题上,可想而知白忙一场。
后来朋友又使用了DependencyWalker,发现它显示的MSVCP100D.DLL两个文件,却是x86的:
而我的,都是x64:
不可能啊!难道传错了?!我又传了一遍,结果还是一模一样。
这次注意到他的MSVCP100D.DLL的大小是743248,也就是700多K,而我的是900多K。
再次使用QQ,这次终于发现QQ在中间做了手脚,传了一个不一样的文件。
难道QQ对这个文件特别照顾?那我把它把个包再传,于是打成了一个zip包:
结果QQ发送失败!
再试!我把mscvp100d.dll和zip都拷到D盘下,再用QQ发送,这次却全都成功了。朋友的问题也解决了。
百慕大System32
难道"System32"文件夹是百慕大?不论是Everything还是QQ,都无法正确处理里面的文件,没有任何的错误提示,直接用sysWOW64下的同名文件代替了。
如果不是我俩本着不搞定不睡觉的决心,不会发现我们几个小时的时间都浪费在这样一个神奇的问题上了。
我个人猜想,这可能是win7对System32这个重要的文件夹有特殊的保护,不过到底是什么原因,还得等高人来揭密了。
把这件事记录下来,希望朋友们遇到类似问题时,可以参考一下。
真相
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384187%28v=vs.85%29.aspx