Используйте C ++ DLL с VB6 - PullRequest
       18

Используйте C ++ DLL с VB6

3 голосов
/ 28 января 2011

Я только что создал DLL для своего босса в MSVC ++ 2010.Я выбрал «Новая Win32 DLL» с опцией «Экспорт символов», так что все полностью стандартно.Есть несколько предопределенных экспортов в файлы нового проекта, класс, его конструктор, глобальную функцию и переменную с фиктивными значениями и файл dllmain.cpp с функцией APIENTRY.Я еще ничего не изменил.

Теперь мой босс хочет использовать экспортированные вещи в своем проекте VB6.Он запустил проект VB6, сделал меню «Проект» - «Ссылки» (переведено с немецкого на английский, так что он может быть несколько другим, но я уверен, что вы понимаете, о чем я) и выбрал файл DLL, как он самобычно делает.

Однако VB6 не может включить его, вместо этого отображается сообщение об ошибке «не удалось включить файл DLL» (реальная причина не указана).То же самое произошло со стандартным новым проектом DLL из Visual C ++ 6. Мой начальник считает, что это может быть связано с тем, что символы на самом деле не экспортируются или VB6 требуется специальное объявление.Кто-нибудь знает в чем проблема?

Ответы [ 5 ]

6 голосов
/ 28 января 2011

Да, VB6 не работает так. Вам нужно объявить функции DLL в вашем VB-коде примерно так:

Private Declare Function WinHelp Lib "user32" Alias "WinHelpA" _
  (ByVal hwnd As Long, ByVal lpHelpFile As String, _
  ByVal wCommand As Long, ByVal dwData As Long) As Long

Вы бы заменили «user32» на «MyCPlusPlusDLL.dll» и использовали бы реальные имена методов, подписи и т. Д. Из вашей DLL. Затем поместите DLL в папку / System, и все будет хорошо.

Примечание: это предполагает, что методы внутри вашей C ++ DLL объявлены с "__declspec".

2 голосов
/ 28 января 2011

Я вижу, вы уже приняли ответ, но он может быть полезен вам или другим. Вызывающая универсальная функция DLL от Paul Caton использует язык ассемблера voodoo, чтобы позволить VB6 вызывать различные типы функций DLL, обычно не вызываемых из VB6.

1 голос
/ 28 января 2011

Если это не библиотека COM, вам нужно экспортировать только функцию C с __stdcall.Вам может потребоваться создать для них файл .def (http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx).. Также используйте средство обхода зависимостей, например, зависимость.exe для просмотра, какие функции были экспортированы и с какими именами.

1 голос
/ 28 января 2011

Для обычной библиотеки DLL вы не можете использовать ссылки на VB, а должны использовать оператор Declare .Другой вариант - создать DLL как ActiveX вместо *. 1005 *

1 голос
/ 28 января 2011

Самый простой способ создать DLL на C ++ и использовать ее из VB6 - это использовать COM.

...