【发布时间】: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 上使用依赖遍历器来查看它所依赖的内容..