【问题标题】:C++ DLL called from Excel VBA only works from debug instance in Visual Studio从 Excel VBA 调用的 C++ DLL 仅适用于 Visual Studio 中的调试实例
【发布时间】:2019-09-12 20:24:04
【问题描述】:

我在 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 新手。

【问题讨论】:

  • int 在 C++ 中将是一个 32 位整数 - Integer 在 VBA 中是一个 16 位整数;你可能希望那是Long
  • 不要混淆这个问题最重要的细节。您的“dll 路径”错误。
  • 这绝对是正确的道路。
  • @HansPassant 我已经检查了无数次路径。另外,如果路径错误,它将无法在调试实例中工作。但你是对的,它的行为就像是走错了路。
  • 您的 DLL 是否具有在开发环境中正确解析的依赖项(例如,因为它们在 PATH 中)但在其他情况下找不到?在 DLL 上使用依赖遍历器来查看它所依赖的内容..

标签: c++ excel vba


【解决方案1】:

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

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

我还不能让 LoadLibrary 工作,但 cmets 建议这样做。

【讨论】:

  • 或许使用LoadLibrary手动加载DLL(但一定有更好的办法)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
相关资源
最近更新 更多