gary hagerty Ответов: 1

Как отправлять и получать строки из библиотеки DLL, написанной на C++, в VB6.


Здравствуйте дамы и господа из проекта Code,

Я пытаюсь понять, как отправлять и получать строки из функции, написанной на C++ (с использованием Visual Studio 2015), в VB6.

Обратите внимание, что строки будут отправляться и приниматься из списка аргументов функции

У меня есть опыт работы с VB6, но не с C++!

Декларация выглядит следующим образом:

VBDLLFUNC(инт) MDNSa35dbd7v2(инт обслуживание, инт AC0_CryptoKeyTable, без знака типа char* семенного материала, без знака типа char* ключ);

Код/оболочка выглядит следующим образом:

VBDLLFUNC(инт) MDNSa35dbd7v2(инт обслуживание, инт AC0_CryptoKeyTable, без знака типа char* семенного материала, без знака типа char* ключ) {
возвращение (a35dbd7v2(обслуживание, AC0_CryptoKeyTable, семян, ключ));
}

Где #определить VBDLLFUNC(Имя_типа) с атрибутом dllexport имя как __stdcall

У меня есть следующее объявление в моем коде VB6:

Объявить функцию MDNSa35dbd7v2 Lib "MDTestDLL.dll" (бывал служба покуда, бывал
CryptoKeyTable Как Долго, Семя Бывал В Строку, Ключ Как Byref Как Строка) Как Долго

В моем событии загрузки формы я вызываю функцию следующим образом:

Частная Суб Form_Load()

Дим лретваль как долго
Тусклый Скей как струна
Dim sSeed как строка

Клиент говорит мне, что если вызовите MDNSa35dbd7v2 с sSeed = 5 байт из 11 (я не знаю, означают ли они 11 dec или B hex) в качестве sSeed

sSeed = Chr(11) & Chr(11) & Chr(11) & Chr(11) & amp; Chr(11)

Я должен вернуть 5 байт из 22 для sKey

lRetVal = MDNSa35dbd7v2(&H1, &H3C, sSeed, sKey)

Конец Подводной Лодки

Вопрос, который у меня есть, заключается в следующем: поскольку я имею дело с VB6, то объявление функций и сама функция, возможно, должны быть объявлены следующим образом:

VBDLLFUNC(инт) MDNSa35dbd7v2(инт обслуживание, инт AC0_CryptoKeyTable, тип BSTR семян, тип BSTR
ключ);

VBDLLFUNC(инт) MDNSa35dbd7v2(инт обслуживание, инт AC0_CryptoKeyTable, тип BSTR семян, тип BSTR ключ) {
возвращение (a35dbd7v2(обслуживание, AC0_CryptoKeyTable, семян, ключ));
}

Пожалуйста, также имейте в виду, что объявление заголовка для a35dbd7v2 выглядит следующим образом:

модификатор extern ключевое слово __declspec(dllexport) или a35dbd7v2 инт(инт обслуживание, инт AC0_CryptoKeyTable, без знака типа char* семенного материала, без знака типа char* ключ);

Поскольку я вызываю эту функцию из VB6, а VB6 использует BSTR при работе со строками, то как бы я преобразовал BSTR в unsigned char*?
Пожалуйста, посоветуйте

Спасибо

Что я уже пробовал:

Я погуглил и думаю, что могу быть близок к этому

1 Ответов

Рейтинг:
1

Richard MacCutchan

Вы уже получили предложения в своем первоначальном вопросе по адресу Как вернуть строку из библиотеки DLL, написанной на C++, в VB6[^]. Если вам нужны разъяснения, пожалуйста, используйте ссылку “есть вопрос или комментарий” под ответом. Пожалуйста, не делайте репостов.


gary hagerty

Как бы я идти о преобразовании в строку BSTR в беззнаковый чар*

Richard MacCutchan

Посмотрите на документацию BSTR: BSTR | Microsoft Docs[^].

gary hagerty

Здравствуйте Сэр,

Большое вам спасибо за ваш ответ, однако ссылка не предоставила мне никаких подробностей о том, как преобразовать строку BSTR в unsigned char*, а затем преобразовать unsigned char* обратно в BSTR, чтобы ее можно было вернуть в VB6.

Спасибо