我有一个Excel工作簿,它调用我用C ++编写的测试DLL。 DLL的路径在VBA中是硬编码的。 DLL使用的唯一文件是stdlib和iostream。
在我的机器上它可以工作。在其他几台办公机器上它可以工作。但是,当我尝试通过Excel调用DLL时,我得到错误48 - 找不到文件。
我的理解是错误53是文件丢失;错误48是缺少依赖项。我使用了依赖walker并且没有发现任何问题。
然而,我发现,如果我在一台机器上安装Visual Studio,那么安装后Excel文件/ DLL完全可以正常工作的几率为90%。在10%它不起作用的情况下,我重新启动并重新运行Visual Studio安装,选择“修复”,安装完成后再次运行Excel / DLL组合。所以基本上安装Visual Studio允许DLL加载DLL。如果我卸载Visual Studio DLL仍然可以正常工作。
显然这意味着这些机器上缺少某些东西,但我不知道是什么 - 我已经尝试单独安装在“程序”下显示的所有部分,例如最新的.net框架,visual c ++ re-distributables等等......它不起作用。唯一有效的是安装Visual Studio本身。 我不确定如何继续,因为要求用户安装5gig ISO并安装开发人员环境并不是很理想。
啊,哈哈,我发现了这个问题。事实证明,它需要2个DLL文件 - msvcr120.dll和msvc120.dll。我在System32文件夹中有这两个文件,但在我的SysWOW64文件夹中没有。一旦我填充该文件夹,那么DLL就开始工作了。我发现google上有很多线程有“相同”的问题,但没有答案,所以如果遇到同样的问题,我建议使用依赖性walker并确保DLL在两个系统文件夹中都是安全的(尽管我怀疑System32仅用于64位DLL,而SysWOW64用于32位DLL。
答案 0 :(得分:1)
最有可能你的DLL依赖于C ++可再发行组件。根据您用于开发DLL的VC ++版本,您应该在目标计算机上安装相关版本的VC ++可再发行组件。
对于VS 2015,您可以在此处找到VC ++可再发行组件: https://www.microsoft.com/en-us/download/details.aspx?id=48145
答案 1 :(得分:0)
使用SysInternals Process Monitor实用程序监视DLL访问并查找错误。一个例子是other answer。观察Excel进程和CreateFile操作。
答案 2 :(得分:0)
我发现google上有很多线程有“相同”的问题,但没有答案,所以如果遇到同样的问题,我建议使用依赖性walker并确保DLL在两个系统文件夹中都是安全的(尽管我怀疑System32仅用于64位DLL,而SysWOW64用于32位DLL。
答案 3 :(得分:0)
当dll与调用程序的位数不对应时,也可以返回错误48。因此,例如,如果您使用Excel 64位运行Excel的VBA,则需要确保将DLL编译为64位二进制文件。
请注意,这与错误53不同,这实际上意味着在任何路径中都找不到DLL。