【问题标题】:Call function in unmanaged c++ dll from vb从 vb 调用非托管 c++ dll 中的函数
【发布时间】:2016-02-09 19:18:47
【问题描述】:

我有一个非托管的 c++ dll(我的创作),它有一个带有一堆输入变量(标量和数组)和输出数组的函数。 我想从一个 Visual Basic 程序中调用它。我有一个简单的表单 + 一个按钮,单击时调用 dll 中的函数。 在vb文件中导入如下:

Module MyDLLModule
  <DllImport("mydll.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Ansi)> Public Function fun(ByVal var1 As Double, _
                                                                  ByVal var2 As Double, _
                                                                  <MarshalAs(UnmanagedType.SafeArray)> ByRef arr1() As Double, _
                                                                  <MarshalAs(UnmanagedType.SafeArray)> ByRef arr2() As Double, _
                                                                  <MarshalAs(UnmanagedType.SafeArray)> ByRef arr3() As Double, _
                                                                  ByVal var3 As Double, _
                                                                  ByVal var4 As Double, _
                                                                  ByVal var5 As Double, _
                                                                  ByVal var6 As Double, _
                                                                  ByVal var7 As Double, _
                                                                  ByVal var8 As Double, _
                                                                  ByVal var9 As Double, _
                                                                  ByVal var10 As Double, _
                                                                  ByVal var11 As Integer, _
                                                                  <MarshalAs(UnmanagedType.SafeArray)> ByRef arr4() As Double, _
                                                                  <MarshalAs(UnmanagedType.SafeArray)> ByRef arrout() As Double) As Integer

  End Function
End Module

它稍后会像任何其他功能一样使用。

这一切都在我开发的机器上运行良好,无论是在 MSVS 中调试还是运行应用程序时。但是当我将所有文件移动到另一台计算机时,它会在单击按钮调用 dll 时抱怨:

"Unable to loadl DLL "mydll.dll": 无法加载指定的模块 成立。 (异常形式 HRESULT:0x8007007E)。

我一直在阅读和测试一些不同的可能性:

  1. 将 dll 添加到与 exe 文件相同的路径
  2. 使用系统路径:C:\MyDLLs,并将 dll 放在这里。
  3. 将 dll 作为现有项添加到 vb 项目,并将属性设置为内容并始终复制。

这些都不起作用。有没有人对此有解决方案的想法?

【问题讨论】:

    标签: c++ vb.net dll unmanaged


    【解决方案1】:

    建议:

    尝试在您的 .dll 上运行 depends.exe 或 dumpbin.exe 以查看它可能具有哪些依赖项。

    1. 您是对的:PATH 是您需要查看的第一件事。如果一切都失败了,请将您的 .dll 复制到 \windows\system32(至少出于调试目的)。

    2. 否则,您的 .dll 可能依赖于“其他东西”。例如特定的 MSVC 运行时。 "depends" (GUI) 或 "dumpbin" (cmd-line)_ 应该会告诉你。

    3. 我假设您的 .dll 不是 COM/ActiveX .dll,问题是您还没有注册它。坦率地说,这也值得仔细检查。

    PS:

    1. 您可以从“MSVS 开发人员命令提示符”运行 dumpbin。

    2. 您可以输入dumpbin /? 来查看选项。你想要dumpbin /dependents mydll.dll

    3. 如果你需要 MSVC 运行时,你可以在这里下载:

    https://www.microsoft.com/en-us/download/details.aspx?id=48145

    【讨论】:

      【解决方案2】:

      感谢 paulsm4:msvc 运行时似乎是问题所在。在编译 mydll.dll 时使用 /MT 标志(据我了解的静态链接)解决了它。

      【讨论】:

        猜你喜欢
        • 2010-11-02
        • 2014-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多