我正在使用Microsoft Visual Studio 2010 Express:C ++和VB版本。
我试图使用:
调用编译为dll的C ++代码
Private Declare Sub CalcGraph Lib "Model.dll" ()
目前不断收到错误:
您的应用程序中发生了未处理的异常。 无法在DLL“Model.dll”
中找到名为“CalcGraph”的入口点
有人可以解释如何正确调用DLL吗?
您是否需要任何其他信息才能更好地了解问题?
我对编程很新,所以请耐心等待我!
也就是说,我已经准备好做腿部工作了,并且已经花了很长时间在这个和其他网站上阅读。似乎没有什么能够很好地匹配我,以帮助我理解出了什么问题。
答案 0 :(得分:3)
好的,在你的帮助和相当多的谷歌之后,这终于有效了!
这是一个破败,以防将来帮助其他人:
BUILDING_DLL
标志,但Visual Studio要求你在main.c文件中创建一个定义。__stdcall
做了一个名为'name decoration'的东西,它与名称修改不同,但仍会改变你的函数名。感谢@slugonamission给我一个指针。最终在使用dumpbin.exe时单击,如@HansPassant所示。__cdecl
设法避免名称修饰,并在C中编译(或使用extern
并在C ++中编译)避免名称重整。隐式/显式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(如果你没有源代码或文档,那么非常有用)