首页 > 解决方案 > 从 Excel VBA 调用的 C++ DLL 仅适用于 Visual Studio 中的调试实例

问题描述

我在 C++ 中创建了一个 64 位 dll。有一个 Excel 宏可以通过列出 dll 的完整路径来调用它。但是,只有当我通过右键单击 C++ 项目并选择 Debug->Start New Instance 打开包含的 Excel 文件时,它才有效。如果我直接从文件资源管理器打开 Excel 文件并尝试运行 dll,它会给我一个“找不到文件”消息框,它找不到 dll,并列出了路径。它在发布模式下给出相同的错误。但是,当我检查路径时,dll 存在并且似乎可以很好地编译到指定位置。

我制作的其他 dll 没有发生这种情况。无论我是从文件资源管理器还是调试实例打开它,都可以调用类似的 dll。这种差异没有任何明显的原因。它们都调用其他 dll,具有命名空间和类,但问题似乎在它到达代码之前就已经发生了。

C++(DLL中的测试函数):

int test(int &x)
{
    return x+8;
}

VBA代码:

Private Declare PtrSafe Function test Lib _
"[path to dll]" (ByRef x As Long) As Long

'  Use function on worksheet
 Function testThis(x As Long) As Long
    On Error GoTo Catch
    testThis = test(x)
Catch:
    If Err <> 0 Then
        MsgBox (Err.Description)
    End If
    End Function

例如,如果我输入“2”,它应该在所有情况下都返回“10”。这发生在仅通过 Visual Studio 启动的调试 Excel 实例中,但给我一条错误消息,即直接打开文件时找不到 DLL。我不知道为什么。

编辑:路径在 VBA 中是正确的。你真的认为我没有检查过吗?这是私人信息,如果错误,它将无法在调试 Excel 实例中工作。

Dependency Walker 给出以下错误: 错误:未找到至少一个必需的隐式或转发的依赖项。错误:由于隐式依赖模块中缺少导出函数,至少一个模块具有未解析的导入。错误:发现具有不同 CPU 类型的模块。错误:检测到循环依赖。警告:至少没有找到一个延迟加载依赖模块。警告:由于延迟加载依赖模块中缺少导出功能,至少有一个模块存在未解析的导入。

我正在研究这些可能意味着什么,但之前没有使用过它,并且是 C++ 和 VBA 新手。

标签: c++excelvba

解决方案


我无法确定依赖项的问题,但 Excel 确实需要一些帮助才能找到它们。为了让任何从属的 DLL 在从 Excel 调用时都能正常工作,包括这种情况,这是一种方法。假设我要直接调用的依赖 DLL 是“A”,而它所依赖的已安装 DLL 是 DLL“B”。为了调用依赖 DLL A 中的任何函数,我首先必须调用独立 DLL B 中的任何函数。无论我从 Excel 调用的函数是哪个函数,甚至直接依赖于 DLL B,都没有关系。使用这个 hack,我可以让 A 中的所有其他函数运行,前提是没有不相关的问题。如果我直接从文件资源管理器打开 Excel 文件并尝试在没有这种 hack 的情况下运行 DLL,它会给我各种错误,如 VALUE 或“

我还将项目属性->输入->附加依赖项中的依赖项清理为 B.lib;%(AdditionalDependencies) 之类的东西,但这没有效果。它只是看起来更好。

我还不能让 LoadLibrary 工作,但评论中建议了这一点。


推荐阅读