Как вызвать файл C ++ dll из Visual Basic 2010 - PullRequest
2 голосов
/ 09 марта 2012

Я использую Microsoft Visual Studio 2010 Express: версии C ++ и VB.

  • Существует некоторый VB-код, который формирует тело программы, и весь GUI.
  • Существует также некоторый код C ++, который выполняет некоторую быструю обработку (много циклов).

Я пытаюсь вызвать код C ++, скомпилированный как dll, используя:

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


И в данный момент получаю сообщение об ошибке:

В вашем приложении произошло необработанное исключение. Невозможно найти точку входа с именем «CalcGraph» в DLL «Model.dll»

Может кто-нибудь объяснить, как правильно вызывать DLL, пожалуйста?
Вам нужна другая информация, чтобы лучше понять проблему?

Я довольно новичок в программировании, поэтому, пожалуйста, будьте терпеливы со мной!
Тем не менее, я готов выполнить работу, и уже потратил довольно много времени на чтение этого и других сайтов. Кажется, ничто не может сравниться достаточно хорошо, чтобы помочь мне понять, что происходит не так.

Ответы [ 3 ]

3 голосов
/ 12 марта 2012

Хорошо, с вашей помощью и изрядной долей Google это наконец работает!

Вот краткий обзор на случай, если это поможет кому-то еще в будущем:

  • Используйте Ultimate Header File для плана создания файла заголовка.
  • Важно понимать, что компиляция как C не будет называть mangle, тогда как компиляция как C ++ будет.
  • Также представляется, что DevC ++ имеет аккуратный флаг BUILDING_DLL, но Visual Studio требует, чтобы вы создали определение в файле main.c.
  • __stdcall делает то, что называется «оформление имени», которое отличается от искажения имени, но все равно изменит имя вашей функции. Спасибо @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)

И это наконец-то сработало!

2 голосов
/ 09 марта 2012

Я собираюсь предположить, что здесь C ++ DLL написана на чистом C ++ (не на C ++ / CLI или чем-то подобном).Кажется, что ключевое слово VB Lib будет импортировать только процедуру .NET, а не собственную процедуру.Вместо этого вам нужно использовать P / Invoke .

Что-то вроде этого может работать

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

Но, конечно, введите свои параметры и типы возврата тоже.

1 голос
/ 09 марта 2012

В некоторых случаях, в зависимости от того, как была сгенерирована DLL (по порядку или по имени), вам может понадобиться использовать DLL с GetProcAddress

Эта документация может дать вам краткий обзоро том, как использовать DLL в старом стиле Обзор ссылок MSDN

И, наконец, DumpBin может помочь вам во многом, позволив вам проверить DLL (довольнополезно, если у вас нет источников или документации)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...