如何从Visual Basic 2010中调用C ++ DLL文件

时间:2012-03-09 10:43:46

标签: c++ vb.net visual-studio dll

我正在使用Microsoft Visual Studio 2010 Express:C ++和VB版本。

  • 有一些VB代码构成了程序的主体,以及所有的GUI。
  • 还有一些C ++代码可以进行一些快速处理(很多循环)。

我试图使用:

调用编译为dll的C ++代码
  

Private Declare Sub CalcGraph Lib "Model.dll" ()


目前不断收到错误:

  

您的应用程序中发生了未处理的异常。   无法在DLL“Model.dll”

中找到名为“CalcGraph”的入口点

有人可以解释如何正确调用DLL吗?
您是否需要任何其他信息才能更好地了解问题?

我对编程很新,所以请耐心等待我!
也就是说,我已经准备好做腿部工作了,并且已经花了很长时间在这个和其他网站上阅读。似乎没有什么能够很好地匹配我,以帮助我理解出了什么问题。

3 个答案:

答案 0 :(得分:3)

好的,在你的帮助和相当多的谷歌之后,这终于有效了!

这是一个破败,以防将来帮助其他人:

  • 使用Ultimate Header File获取有关如何创建头文件的蓝图。
  • 重要的是要理解如何编译C不会命名mangle,而编译为C ++会。
  • DevC ++似乎还有一个整洁的BUILDING_DLL标志,但Visual Studio要求你在main.c文件中创建一个定义。
  • __stdcall做了一个名为'name decoration'的东西,它与名称修改不同,但仍会改变你的函数名。感谢@slugonamission给我一个指针。最终在使用dumpbin.exe时单击,如@HansPassant所示。
  • 所以,切换到__cdecl设法避免名称修饰,并在C中编译(或使用extern并在C ++中编译)避免名称重整。
  • 并且dll最终会给我CalcGraph作为有效的切入点!

隐式/显式dll链接是一个非常重要的区别。隐式链接需要.lib文件,.dll以及.h文件。明确的链接是我所追求的 - 你可以自己逃脱.dll。感谢@squelos解释此链接。

最后但并非最不重要:

在dll中:

extern _COMPILING_ void __cdecl CalcGraph(PanelParameters *, Calculations *);

在VB代码中:

Imports System.Runtime.InteropServices

Private Declare Sub CalcGraph Lib "myDLL.dll" (ByRef params As Parameters, _
ByRef calcs As Calculations)

它终于奏效了!

答案 1 :(得分:2)

我将在这里假设C ++ DLL是用纯C ++编写的(不是C ++ / CLI或类似的东西)。似乎VB Lib关键字只会导入.NET过程,而不是本机过程。相反,您需要使用P/Invoke

这样的事可能有效

<DllImport("Model.dll")>
Public Shared Function CalcGraph
End Function

但当然,也要填写参数和返回类型。

答案 2 :(得分:1)

在某些情况下,根据DLL的生成方式(序数或名称),您可能必须使用GetProcAddress

的DLL

此处的文档可以让您快速了解如何使用DLL&oldschool方式MSDN Linking overview

最后,DumpBin可以帮助你检查一个DLL(如果你没有源代码或文档,那么非常有用)