Вызов библиотеки DLL Visual Basic в C ++, часть 2 - PullRequest
4 голосов
/ 11 сентября 2010

Этот вопрос является продолжением предыдущего вопроса ( здесь ).

Я приобрел библиотеку DLL, созданную в Visual Basic, у стороннего поставщика ( Sensor DLL.dll ). Эта DLL содержит функции для общения с датчиком, и мне нужно вызывать эти функции из программы на Visual C ++, которую я пишу. Поставщик не предоставит файл заголовка, и я не знаю Visual Basic.

У меня есть небольшое количество документации по каждой функции. Например, мне сказали, что одна функция ( Get_Data ) в DLL имеет вид:

Public Function Get_Data(ByVal Handle As String) As String

, которая будет возвращать строку со значением от -16777216 до +16777215. Это все.

В предыдущем вопросе пользователь Ганс Пассант дал этот полезный ответ:

VB6 DLL обычно является COM-сервером. На самом деле у вас есть эквивалент файла .h, в него встроена библиотека типов. Начните с Project + Properties, Common Properties, Framework и References. Кнопка «Добавить ссылку», вкладка «Обзор», выбор библиотеки DLL.

Далее View + Object Browser. Вы должны увидеть сгенерированную библиотеку Interop в списке. Откройте узел, чтобы увидеть, что там. Вы пишете обычный управляемый код, такой как gcnew, для создания COM-объекта и вызова методов интерфейса. Вам нужна минимальная документация по доступным методам, чтобы догадаться, как их следует вызывать.

Следуя этому совету, я действительно увидел список функций в DLL в Object Browser, включая Get_Data(System::String), однако я запутался в работе с COM-объектами, что мне не по вкусу.

Я попытался просто позвонить Get_Data(Handle);, где Handle - это BSTR, теперь, когда я добавил ссылку на свой проект, но она не была распознана. Я также пытался сначала позвонить CoInitialize, но это не помогло.

Может кто-нибудь сказать мне конкретно, что мне нужно написать сейчас, чтобы вызвать функцию? Спасибо!

1 Ответ

1 голос
/ 13 июня 2011

Если я правильно понимаю вашу ситуацию, у вас есть хотя бы один COM-объект, реализованный в VB6 .dll.Чтобы использовать этот объект, вы должны создать экземпляр COM-объекта перед вызовом метода GetData.CoInitialize будет только инициализировать систему COM.Вы также должны использовать такой API, как CoCreateInstance.

...