LDR: LdrpWalkImportDescriptor()解决方案

Form:http://yarin.blog.51cto.com/1130898/422187

 

今天编译一开源项目,他提供的是VC9的工程,我这边是VC10,首先,打开之后需要经过转换,一切正常,然后编译,出现一个简单的小的错误,更改之后编译通过,但是运行时出现下图所示的错误。

“应用程序正常初始化(oxc0150002)”失败,请单击“确定”,终止应用程序。

然后再调试输出信息中查看得到如下信息:

 

 

这种情况到时比较多见了,一般都是链接库的问题,网上问这个问题的也很多,这里就给说明一下。出错信息说是libpng.dll的问题,那么我们就打开这个dll来检查一下吧。下图是该dll的版本信息:

基本上这版本信息上也看不出什么错误来,下面就只能查看该DLL的二进制信息了,打开之后,终于发现问题了,如下图所示:

选中的部分其中包含了 “name="Microsoft.VC90.DebugCRT" version="9.0.21022.8"”,这里的name值说明编译该DLL是使用的VC9.0而且还是Debug版本的,而version值则是 一个版本号,还真有些郁闷了,既然是发布,为什么还要编译Debug版本的呢?Debug版本需要环境高度一致才能兼容,release版本则不会有这些 问题存在,如何解决这个问题呢?

方法一: 卸载VC10,改装VC9,这个比较麻烦,不考虑了。
方法二: 将对应版本的 “Microsoft.VC90.DebugCRT”拷贝到system32中,一般位于VC的安装目录中的redist文件夹下,如下图所示,选中的 Debug_NonRedist(其下的x64和x86)表示是Debug版本使用的,而另外两x64和x86则是release版本的。这里的截图暂时 还是VC10的,路径为:Microsoft Visual Studio 10.0/VC/redist/Debug_NonRedist/x86

方法三: 直接找到libpng的源代码,自己来编译DLL(个人比较推荐这种方式)。
因此,我们以后在发布程序时也需要注意这样的问题,以免出现这样的不兼容的情况。

 

PS:方法二在Windows XP中没有效果,拷贝在System32,对于调试版本并不能正确运行,必须拷贝到dll对应的目录下才可以运行。Release版本只需要安装相应的SP1即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章