=======================================================
无法定位程序输入点 StrCpyNW 于动态链接库 ****.dll 上。
=======================================================
经常情况下,用一些旧版本编译器开发的程序在新的操作系统上不能正常运行。
例如,用 VC6.0 开发的在 XP 上可以正常运行的程序,现在在 Win7/ Win10 执行不了,经常出现类似下列错误:
鉴于笔者已经遇到过至少三次此类情况了, 特简要撰写此文。
究其原因,是因为 Win XP, Win7, Win10 下各个操作系统的 shell32.dll 模块导出接口差异很大,
如果依赖于该 DLL,则一些早期开发的程序在新版本操作系统上将出现此类错误。反之同理。
如果手头有源码,当然可以选择重新编译整个程序来解决。
否则,可以尝试下列解决方案:
(1)首先找到依赖于 shell32.dll 的模块,建议下载 ExStudPE Visual Tools 分析查看,下载地址:
https://github.com/tankaishuai/ExStudPE_Visual_Tools
用该工具打开目标模块,例如 笔者的问题模块 ExtractText2.dll :
可见其依赖了一个 StrCpyNW 接口,在 XP 下没问题,但在 Win10 上,该接口不存在,故而无法运行。
(PS:有人可能会想直接把XP的 shell32.dll 挪过来用,遗憾的是这样是无法加载成功的。)
(2)选择【Shell32.dll】下【Name】项,右键,【跳转至选取RVA】:
(3)菜单【选择】->【修改文件数据】:
(4)修改如下:
将 32 换成 41,点击【确定】。(即是将 shell32.dll 换成 shell3a.dll )
(5)菜单【文件】->【保存全部数据】,将修改的模块存盘保存,并替换为原来的文件。
(6)下载 win32exts.dll ,github 下载地址:
https://github.com/tankaishuai/win32exts_for_Lua
【注】win32exts.dll 实现了 Win XP ~ Win10 下各个操作系统的 shell32.dll 的全部接口。
并将 win32exts.dll 重命名为 shell3a.dll 放于目标程序同级目录下即可。
修改完成。尝试运行下,大功告成!!!