2016-09-21 304 views
3

我有一个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)。

回答

0

使用Sysinternals的进程监视器实用程序来监视DLL访问和查找错误。一个例子是other answer。观看Excel进程和CreateFile操作。

0

啊哈,我找到了问题。事实证明,它需要2个DLL文件 - msvcr120.dll和msvc120.dll。我在我的System32文件夹中有这两个文件,但没有在我的SysWOW64文件夹中。只要我填充该文件夹,然后DLL开始工作。

我在google上发现了很多与'相同'问题但没有答案的线程,所以如果遇到同样的问题,我会建议使用依赖关系walker并确保这两个DLL在两个系统文件夹中都是安全的(尽管我怀疑System32只需要64位DLL,而SysWOW64需要32位DLL)。

0

错误48也可以返回当dll不对应调用程序的位数。因此,例如,如果您使用Excel 64位运行Excel的VBA,则需要确保将DLL编译为64位二进制文​​件。

注意这与错误53不同,这实际上意味着DLL在任何路径中都找不到。