Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

vb.net - How to call a C++ dll file from Visual Basic 2010

I'm using Microsoft Visual Studio 2010 Express: the C++ and VB versions.

  • There is some VB code that forms the body of a program, and all the GUI.
  • There is also some C++ code that does some fast processing (lots of loops).

I am trying to call the C++ code, compiled as a dll, using:

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


And at the moment keep getting the error:

Unhandled exception has occurred in your application. Unable to find an entry point named 'CalcGraph' in DLL 'Model.dll'

Could someone explain how to correctly call the DLL, please?
Do you need any other information to better understand the problem?

I'm fairly new to programming, so please be patient with me!
That said, I'm prepared to do the leg-work, and have already spent quite a while reading around on this and other sites. Nothing seems to match quite well enough to help me understand what's going wrong.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Okay, with your help and a fair bit of Google, this finally works!

Here's a run-down, in case it helps anyone else in the future:

  • Use the Ultimate Header File for a blueprint of how to create the header file.
  • It is important to understand how compiling as C will not name mangle, whereas compiling as C++ will.
  • It also appears that DevC++ has a neat BUILDING_DLL flag but Visual Studio requires you to create a definition in your main.c file.
  • __stdcall does something called 'name decoration' that is different from name mangling but will still change your function name. Thanks to @slugonamission for giving me a pointer about this. It finally clicked when using dumpbin.exe, as suggested by @HansPassant.
  • so, switching to __cdecl manages to avoid name decoration, and compiling in C (or using extern and compiling in C++) avoids name mangling.
  • and the dll will finally give me CalcGraph as a valid entry point!

The Implicit / Explicit dll linking is a very important distinction. Implicit linking requires a .lib file, the .dll and perhaps also a .h file. Explicit linking is what I was after - you can get away with the .dll by itsself. Thanks to @squelos for the link explaining this.

And last but not least:

In the dll:

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

And in the VB code:

Imports System.Runtime.InteropServices

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

And it finally worked!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...