用QQ传dll文件,你可能会遇到灵异事件

今天一个奇怪的问题,折磨了我跟朋友几个小时。经过九九八十一难之后,终于发现,原来这是灵异事件--传个文件都不省心!

我跟朋友的操作系统都是win7 x64,安装的都是VS 2012 RC和VC++ 2010 express,以及opencv 2.4.2。朋友用vc++写了一个OpenCV的hello world,采用的是其x64的dll,也编译为x64代码,但是死活运行不起来。一运行就报错:

 

用QQ传dll文件,你可能会遇到灵异事件_第1张图片

 

据说,该错误代码0xc000007b表示:STATUS_INVALID_IMAGE_FORMAT. 按我的经验来说,这是因为64位的程序调用了32位的库。

我让朋友把生成的exe文件发过来,在我这边运行却完全正常。

MSVCP100D.DLL和MSCVR100D.DLL

为了搞清楚该程序到底依赖了哪些DLL,请出DependencyWalker神器。朋友发过来了截图:

image

原来少了这个文件!

下面的灵异故事就围绕着这个MSCVR100D.DLL和它的兄弟MSCVP100P.DLL展开。

Everything出场

我打开Everything,输入MSVCP100D.DLL,结果如下:

用QQ传dll文件,你可能会遇到灵异事件_第2张图片

可以看到,在System32和SysWOW64下,各有一个。它们大小相同,修改时间也一样,所以我以为它们是一样的。

然后实际上呢?看这里:

用QQ传dll文件,你可能会遇到灵异事件_第3张图片

System32下的大小,实际上是991K!而且修改日期也不是12:15。

此为灵异事件1。如果仅仅如此,不算是灵异事件,而应该算是Everything的BUG了。

QQ出场

我把System32下的msvcp100d.dll拉到QQ上,向朋友发送过去。奇怪的是,我明明拉的是991K的这个,但它显示的都是726K的这个!

用QQ传dll文件,你可能会遇到灵异事件_第4张图片

由于我从来没想到QQ竟然会在中间狸猫换太子,还以为发送的就是991K的那个呢。

然而朋友拷过去后,运行程序还是出错。我们只好把目光再次集中在程序代码、环境变量设置等问题上,可想而知白忙一场。

后来朋友又使用了DependencyWalker,发现它显示的MSVCP100D.DLL两个文件,却是x86的:

image

而我的,都是x64:

image

不可能啊!难道传错了?!我又传了一遍,结果还是一模一样。

这次注意到他的MSVCP100D.DLL的大小是743248,也就是700多K,而我的是900多K。

再次使用QQ,这次终于发现QQ在中间做了手脚,传了一个不一样的文件。

难道QQ对这个文件特别照顾?那我把它把个包再传,于是打成了一个zip包:

image

结果QQ发送失败!

image

再试!我把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

转载于:https://www.cnblogs.com/9keyes/archive/2012/08/07/2627489.html

你可能感兴趣的:(用QQ传dll文件,你可能会遇到灵异事件)