从 vb 调用非托管 c++ dll 中的函数
Call function in unmanaged c++ dll from vb
我有一个非托管的 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": The specified module could not be
found. (Exception form HRESULT: 0x8007007E).
我一直在阅读和测试一些不同的可能性:
- 将 dll 添加到与 exe 文件相同的路径
- 使用系统路径:C:\MyDLLs,并将dll放在这里。
- 将 dll 作为现有项添加到 vb 项目并将属性设置为内容并始终复制。
None 这些作品。有没有人有解决这个问题的想法?
建议:
在您的 .dll 上尝试 运行ning depends.exe 或 dumpbin.exe 以查看它可能有哪些依赖项。
你是对的:PATH 是你需要看的第一件事。如果所有其他方法均失败,则将您的 .dll 复制到 \windows\system32(至少用于调试目的)。
否则,您的 .dll 可能依赖于 "something else"。比如具体的MSVC 运行时间。 "depends" (GUI) 或 "dumpbin" (cmd-line)_ 应该告诉你。
我假设你的 .dll 是 NOT 一个 COM/ActiveX .dll,问题是你还没有注册它。坦率地说,这也值得仔细检查。
PS:
您可以从 "MSVS Developer Command Prompt".
运行 dumpbin
您可以键入 dumpbin /?
来查看选项。你想要 dumpbin /dependents mydll.dll
.
如果需要MSVC运行时间,可以在这里下载:
https://www.microsoft.com/en-us/download/details.aspx?id=48145
感谢 paulsm4:msvc 运行时似乎是问题所在。编译时使用 /MT 标志(据我所知是静态链接)mydll.dll 解决了它。
我有一个非托管的 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": The specified module could not be found. (Exception form HRESULT: 0x8007007E).
我一直在阅读和测试一些不同的可能性:
- 将 dll 添加到与 exe 文件相同的路径
- 使用系统路径:C:\MyDLLs,并将dll放在这里。
- 将 dll 作为现有项添加到 vb 项目并将属性设置为内容并始终复制。
None 这些作品。有没有人有解决这个问题的想法?
建议:
在您的 .dll 上尝试 运行ning depends.exe 或 dumpbin.exe 以查看它可能有哪些依赖项。
你是对的:PATH 是你需要看的第一件事。如果所有其他方法均失败,则将您的 .dll 复制到 \windows\system32(至少用于调试目的)。
否则,您的 .dll 可能依赖于 "something else"。比如具体的MSVC 运行时间。 "depends" (GUI) 或 "dumpbin" (cmd-line)_ 应该告诉你。
我假设你的 .dll 是 NOT 一个 COM/ActiveX .dll,问题是你还没有注册它。坦率地说,这也值得仔细检查。
PS:
您可以从 "MSVS Developer Command Prompt".
运行 dumpbin
您可以键入
dumpbin /?
来查看选项。你想要dumpbin /dependents mydll.dll
.如果需要MSVC运行时间,可以在这里下载:
https://www.microsoft.com/en-us/download/details.aspx?id=48145
感谢 paulsm4:msvc 运行时似乎是问题所在。编译时使用 /MT 标志(据我所知是静态链接)mydll.dll 解决了它。