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