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

标签 c++ excel vba dll

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

在我的机器上它可以工作。在其他几台办公机器上它可以工作。但是,在其余部分,当我尝试通过 Excel 调用 DLL 时,出现错误 48 - 找不到文件。

我的理解是错误53是文件丢失;错误 48 是缺少依赖项。我使用了 dependency walker 并没有发现任何问题。

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

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


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

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

最佳答案

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

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

关于c++ - VBA 调用 C++ DLL - 错误 48(找不到文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39610157/

相关文章:

c++ - C++标准库的头文件在哪里

python - pd.read_csv 无法加载 csv 文件的第一列,并且在 Excel 中打开和保存时文件大小发生变化

VBA Excel QueryTables.add .刷新BackgroundQuery错误

ms-access - MS Access : How to bypass/suppress an error?

excel - VBA 从网站插入 .csv,.csv 不在 url

c++ - 没有函数模板如何使用mem_fun_ref?

c++ - iterator->second 是什么意思?

c++ - Embarcadero 无法从 'UnicodeString' 转换到 'unsigned char *'

excel - 以编程方式确定 Excel 文件 (.xls) 是否包含宏

string - VBA - 使用 startPOS 和 endPOS 拆分字符串函数