从vb调用非托管c++dll中的函数

Call function in unmanaged c++ dll from vb

本文关键字:c++dll 函数 vb 调用      更新时间:2023-10-16

我有一个非托管的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:时,它会抱怨

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

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

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

这些都不起作用。有人有解决这个问题的办法吗?

建议:

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

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

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

  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

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