OpenCv MPR.DLL WNetRestoreConnectionA
最近在搞opencv。有个问题连续搞了两次,本来已经搞好了,过了个国庆,回来全忘了,结果又搞了大半天。最后终于发现之前已经搞过一次了。现在记下来,以免再搞第3次。
是这样的。我的工程(vs2005,MFC)使用了cv110.dll,cxcore110.dll 两个opencv的库。在公司的机器上运行正常,拷到家里的机器就不能初始化。运行就报错误"应用程序正常初始化(0xc0150002)失败..."。
使用depends.exe查看,发现工程的exe使用了MFC80U.dll,它又使用了SHLWAPI.dll,后者使用了MPR.dll,该dll有个输出函数WNetRestoreConnectionA无法定位,导致程序初始化失败.
这里MPR.dll是个延迟加载的dll,按理来说,只要不真实调用该函数就没有问题.但现在的情况是我的工程代码中肯定没有调用MRP.dll中的任何输出函数,但程序却挂了.看来比较奇怪。网上搜了一把,发现有说静态链接MFC的。好像有点道理,本来没有使用这个函数,如果静态链接的话,就应该绕过了MFC80U.dll,因此也就没有MPR.dll。结果一试,不行。反复折腾了好几个小时,最后都想重装系统了(我家里的xp+sp2,公司的xp+sp3)。也想过下载个mpr.dll。最后终于想起来,好像以前搞过类似的问题(唉,就在几天前,都忘了)。
原来不是MFC80U.dll的事,是opencv的dll。CXCORE110.DLL使用了ADVAPI32.DLL(主要是注册表相关函数)。调用关系依次是:
SECUR32.DLL-->NETAPI32.DLL-->DNSAPI.DLL-->IPHLPAPI.DLL-->
MPRAPI.DLL-->SETUPAPI.DLL-->SHLWAPI.DLL-->MPR.DLL
那剩下的事就好办了。opencv是开源的嘛,有源代码的。只要找到相关代码,注释掉就好了。代码在 ...cxcore\src\cxswitcher.cpp中。把函数icvInitProcessorInfo注释掉就好了。当然如果你需要cpu信息方面的功能,就没这么省事了。我就简单的这么处理了。编译后,替换原来的两个dll,运行后,ok。
这里其实还有几个问题没有搞清楚,等哪天有时间了再研究。现在先这么解决一下,能用就行。