VBA调用C ++ DLL – 错误48(找不到文件)

我有一个Excel工作簿,调用我在C ++中编写的testingDLL。 DLL的path在VBA中被硬编码。 该DLL使用的唯一文件是stdlib和iostream。

在我的机器上,它的作品。 在其他几个办公室机器上工作。 但是,当我尝试通过Excel调用DLL的其余部分,我得到错误48 – 文件未find。

我的理解是错误53是文件丢失; 错误48是缺less依赖关系。 我已经使用依赖沃克,并没有发现任何问题。

然而,我发现,如果我在一台机器上安装Visual Studio,安装完成后,有90%的机会可以完美地运行Excel文件/ DLL。 在10%,它不起作用,我重新启动并重新运行Visual Studio安装,select“修复”,并在安装完成后,Excel / DLL组合工作。 所以基本上安装Visual Studio允许DLL加载的Excel。 如果我卸载Visual Studio的DLL仍然正常工作。

显然,这意味着这些机器上缺less一些东西,但是我不知道是什么 – 我已经尝试过单独安装“程序”下显示的所有部分,比如最新的.net框架,visual c ++可重新分发等等。 ..它不工作。 唯一可行的是安装Visual Studio本身。 我不确定如何继续,因为要求用户安装5gig ISO并安装开发人员环境并不是很理想。


啊哈,我发现了这个问题。 事实certificate,它需要2个DLL文件 – msvcr120.dll和msvc120.dll。 我有我的System32文件夹中的这2个文件,但不是在我的SysWOW64文件夹中。 只要我填充该文件夹,然后DLL开始工作。

我发现在谷歌与“相同”的问题,但没有答案的许multithreading,所以如果你遇到同样的问题,我会build议使用依赖沃克,并确保DLL在两个系统文件夹是安全的(虽然我怀疑System32是只需要64位的DLL,而SysWOW64则需要32位的DLL)。

很可能你的DLL依赖于C ++的可再发行组件。 根据您用来开发DLL的VC ++版本,您应该在目标机器上安装相关版本的VC ++可再发行版本。

在VS 2015的情况下,你可以在这里findVC ++的可再发行组件: https : //www.microsoft.com/en-us/download/details.aspx?id = 48145

使用SysInternals进程监视器实用程序来监视DLL访问并查找错误。 其他的答案就是一个例子。 观看Excel进程和CreateFile操作。

啊哈,我发现了这个问题。 事实certificate,它需要2个DLL文件 – msvcr120.dll和msvc120.dll。 我有我的System32文件夹中的这2个文件,但不是在我的SysWOW64文件夹中。 只要我填充该文件夹,然后DLL开始工作。

我发现在谷歌与“相同”的问题,但没有答案的许multithreading,所以如果你遇到同样的问题,我会build议使用依赖沃克,并确保DLL在两个系统文件夹是安全的(虽然我怀疑System32是只需要64位的DLL,而SysWOW64则需要32位的DLL)。

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

注意,这与53错误不同,这意味着DLL在任何path中都找不到。