我有一个非托管的c ++ dll(我的创建),它有一个带有一堆输入变量(标量和数组)和输出数组的函数。 我想从一个视觉基础程序中调用它。我有一个简单的表单+一个按钮,在单击时调用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)。
我一直在阅读和测试一些不同的可能性:
这些都不起作用。有没有人有想法解决这个问题?
答案 0 :(得分:1)
建议:
尝试在.dll上运行depends.exe或dumpbin.exe以查看它可能具有哪些依赖项。
你是正确的:PATH是你需要关注的第一件事。如果所有其他方法都失败,请将.dll复制到\ windows \ system32(至少用于调试目的)。
否则,您的.dll可能依赖于&#34;其他内容&#34;。例如特定的MSVC运行时。 &#34;取决于&#34; (GUI)或&#34; dumpbin&#34; (cmd-line)_应该告诉你。
我假设您的.dll NOT 是一个COM / ActiveX .dll,问题是您还没有注册它。坦率地说,这也值得仔细检查。
PS:
您可以从&#34; MSVS Developer命令提示符&#34;运行dumpbin。
您可以输入dumpbin /?
来查看选项。你想要dumpbin /dependents mydll.dll
。
如果事实证明您需要MSVC运行时,可以在此处下载:
https://www.microsoft.com/en-us/download/details.aspx?id=48145
答案 1 :(得分:1)
感谢paulsm4:msvc运行时似乎是问题所在。在编译mydll.dll时使用/ MT标志(据我所知静态链接)解决了它。