首页 文章

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

提问于
浏览
3

我有一个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 Studio本身 . 我不确定如何继续,因为要求用户安装5gig ISO并安装开发人员环境并不是很理想 .


啊哈,我发现了这个问题 . 事实证明,它需要2个DLL文件 - msvcr120.dll和msvc120.dll . 我在System32文件夹中有这两个文件,但在我的SysWOW64文件夹中没有 . 一旦我填充该文件夹,那么DLL就开始工作了 .

我发现google上有许多线程有“相同”的问题,但没有答案,所以如果你遇到同样的问题,我建议使用依赖walker并确保DLL在两个系统文件夹中是安全的(虽然我怀疑System32是仅需要64位DLL,而SysWOW64适用于32位DLL) .

4 回答

  • 0

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

    对于VS 2015,您可以在此处找到VC可再发行组件:https://www.microsoft.com/en-us/download/details.aspx?id=48145

  • 1

    使用SysInternals Process Monitor实用程序监视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

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

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

相关问题