繁体   English   中英

从Excel VBA调用的C ++ DLL仅在Visual Studio中的调试实例中有效

[英]C++ DLL called from Excel VBA only works from debug instance in Visual Studio

我在C ++中创建了一个64位dll。 有一个Excel宏可以通过列出dll的完整路径来调用它。 但是,仅当我通过右键单击C ++项目并选择“调试”->“启动新实例”打开包含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实例中运行。

依赖项Walker出现以下错误:错误:找不到至少一个必需的隐式或转发依赖项。 错误:由于隐式相关模块中缺少导出功能,因此至少一个模块的导入无法解析。 错误:找到了具有不同CPU类型的模块。 错误:检测到循环依赖性。 警告:至少找不到一个延迟负载依赖性模块。 警告:由于依赖于延迟负载的模块缺少导出功能,因此至少一个模块的导入无法解析。

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

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

我还清理了项目Properties-> Input-> Additional依赖项中的依赖项,类似于B.lib;%(AdditionalDependencies),但这没有任何效果。 看起来好多了。

我还无法使LoadLibrary正常工作,但是在注释中建议这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM