Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22

Вернуть строку из .dll на С++ в программу на VB 6.0

02.02.2020, 12:54. Показов 4996. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Перепробовал несколько вариантов. Не получается. Постоянно ошибки.
Последний опробованный и не работающий вариант:
C++
1
2
3
4
string _stdcall mytext ()
{
    return "cyberforum 2020 г.";
}
Visual Basic
1
2
3
Private Declare Function mytext Lib "mybibl.dll" _
                            () As String
Label1 = mytext()
Пробовал возвращать строку
C++
1
2
           string a = "cyberforum 2020 г.";
       return a;
Уничтожается ли строка при выходе из .dll?
Как сделать правильно?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2020, 12:54
Ответы с готовыми решениями:

Как вернуть строку из функции на C++ (которая находится в dll) в C# проект?
Добрый день, есть dll на C++, которая служит как бы оберткой к сишной библиотеке. В этой Dll есть класс public ref class ClassName,...

Как вернуть переменные из dll обратно в программу?
Есть dll в которой процедура берет несколько целочисленных переменных и оперируя ими изменяет их, но собственно как вернуть их обратно в...

Вернуть HBITMAP из c++ dll
Во общем есть dll, в ней функция которая сохраняет в bmp файл, сохраняет из HBITMAP переменной, как мне сделать так, что б эту переменную...

46
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.02.2020, 19:54
Студворк — интернет-сервис помощи студентам
Так надо 19 ...

Добавлено через 58 секунд
"cyberforum 2020 г." это 19 символов (еще '\0')
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.02.2020, 19:58
Avazart, может и больше, если исходник в UTF-8. Буковка г займет 2 байта.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
04.02.2020, 21:39  [ТС]
DrOffset, ваш вариант вывода в консоль почему-то не работает. Появляется окно консоли с мигающим курсором и всё.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Console
{
public:
    Console() {
        AllocConsole();
        freopen("CONOUT$", "w", stdout);
     //system("pause");
    }
    ~Console() {
        FreeConsole();
    }
};
 
static void init_console()
{
    static Console con;
}
 
bool _stdcall mytext (char *buffer, int* buffer_size)
{
  init_console();
    const std::string s = "cyberforum 2020 г.";
 
   *buffer_size = s.size(); 
 
    if(*buffer_size<s.size()+1)
       {
       *buffer_size = s.size(); 
       return false;
    }
     strcpy(buffer,s.c_str());
      *buffer_size = s.size();
cout << s.size();       //printf("%d, s.size()");   так же не работает
    return true;
}
Добавлено через 7 минут
Заработало. Исключил строки:
C++
1
2
3
4
5
 if(*buffer_size<s.size()+1)
       {
       *buffer_size = s.size(); 
       return false;
    }
Результат вызова функции = 1, в буфере числа.

Добавлено через 1 час 8 минут
Всё заработало. Ошибка была в строке 24. Если уравнять значения
C++
1
*buffer_size = s.size();
то дальнейшее сравнение всегда будет ложным.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.02.2020, 23:40
Цитата Сообщение от DrOffset Посмотреть сообщение
Avazart, может и больше, если исходник в UTF-8. Буковка г займет 2 байта.
Да не суть, cуть в том что ф-ция возвращает false и нужный размер если не влазит.
Но автор упорно не включается в процесс и не хочет думать головой, поэтому в этой теме нечего делать.

https://ideone.com/LqO9aL
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
05.02.2020, 12:35  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Но автор упорно не включается в процесс
"Автор" завершил процесс. Нашёл и удалил из кода ошибку (см. пост №23). Из VB 6.0 нормально вызывается и нормально отображается.
Сделал вывод, что из кода на С++ функция может возвращать строку, как минимум, двумя опробованными способами, а возврат строки из .dll сложнее и удобнее всего изменять массив, переданный по указателю, с последующей конвертацией в строку на стороне вызова.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.02.2020, 14:41
Цитата Сообщение от Argus19 Посмотреть сообщение
Нашёл и удалил из кода ошибку (см. пост №23).
Мм в https://www.cyberforum.ru/post14225130.html она была мной исправлена,Вы бы это заметили если бы хоть немного вникали в код.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
05.02.2020, 15:15  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Вы бы это заметили если бы хоть немного вникали в код.
Я и заметил, когда вник.
Спасибо за помощь.
Мне ещё многое не ясно. Например, почему тестовая консоль не закрывается до закрытия программы, вызывающей библиотеку, несмотря на отключение её от вызывающего процесса
C++
1
2
3
~Console() {
        FreeConsole();
    }
И т.д.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.02.2020, 15:46
Я бы не использовал консоль для отладки как по мне она работает не очевидно и иногда возникают ошибки.
Проще писать в лог файл.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
05.02.2020, 15:55  [ТС]
Так проще и быстрее. Сразу видно что не так.
Как я понимаю, если добавить в консоль:
C++
1
 freopen("CONIN$", "rt", stdin);
можно вводить параметры для изменения некоторых возможностей библиотеки. Например, изменять условия в if, while и т.п.
Не такие уж у меня "могучие" потребности.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.02.2020, 16:01
Оно заманчиво, но как я сказал все нивелируется тем что это дополнительный источник ошибок.
Возможно лучше создать свое окно на WinApi к примеру.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
05.02.2020, 16:01
Цитата Сообщение от Argus19 Посмотреть сообщение
Например, почему тестовая консоль не закрывается до закрытия программы
Потому что деструкторы статических объектов вызываются в конце программы.

Если хотите контролировать этот процесс, сделайте функции управлением открытием и закрытием консоли и вызывайте их из основной программы когда вам нужно.

Добавлено через 21 секунду
Цитата Сообщение от Argus19 Посмотреть сообщение
Например, почему тестовая консоль не закрывается до закрытия программы
Потому что деструкторы статических объектов вызываются в конце программы.

Если хотите контролировать этот процесс, сделайте функции управлением открытием и закрытием консоли и вызывайте их из основной программы когда вам нужно.
1
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
05.02.2020, 17:56  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Возможно лучше создать свое окно на WinApi
Пока не умею.

Добавлено через 1 час 46 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
сделайте функции управлением открытием и закрытием консоли и вызывайте их из основной программы когда вам нужно.
Пробовал разные варианты закрытия окна консоли из интернета. Ни один вариант не сработал.
По-прежнему окно закрывается либо при закрытии вызывающей программы, либо консоль и вызывающая программа закрываются при закрытии консоли "по крестику".
Подскажите, пожалуйста, правильный вариант.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.02.2020, 18:24
Там кажется можно получить хендл окна консольного и ему послать WM_CLOSE програмно.

Добавлено через 1 минуту
https://docs.microsoft.com/en-... solewindow

Вопрос только в том как это будет работать если вызывающее приложение тоже будет консольным.

Добавлено через 1 минуту
Ну и вообще стоит поизучать https://docs.microsoft.com/en-... -functions
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
05.02.2020, 19:25  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Там кажется можно получить хендл окна консольного и ему послать WM_CLOSE програмно.
Я использовал для вызова диалога открытия файла из консольного приложения:
C++
1
2
HWND hwnd = GetConsoleWindow();     //извлекает дескриптор окна, используемый 
                                //консолью, связанной с вызывающим процессом
Как ему послать указанное вами сообщение?
По ссылкам есть создание и закрытие псевдо-консоли.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.02.2020, 19:55
Через SendMessage() или PostMessage()
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
05.02.2020, 21:38  [ТС]
Странно. Дважды спрашиваю дескриптор консоли, в библиотечной функции и в классе консоли. Получаю разные значения.
В классе: 005А03BE, в функции: 005А03BE256.
Попытки закрыть окно и там и там через
C++
1
DestroyWindow(hwnd);
ни к чему не приводит.
Отправить сообщение через SendMessage() не получается из-за того, что оно "не видит" hwnd.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.02.2020, 21:50
Скорее всего проблемы в Вашем коде.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
06.02.2020, 18:36  [ТС]
Передал сообщение WM_CLOSE консоли. Дескриптор окна передал через глобальную переменную. Закрывается и окно консоли и программа на VB 6.0.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.02.2020, 19:43
А чего Вы ожидали?
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
06.02.2020, 19:43  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А чего Вы ожидали?
Закрытия только консольного окна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.02.2020, 19:43
Помогаю со студенческими работами здесь

Вернуть TBitmap из .dll
Доброго времени суток! Столкнулся со странным глюком, и как обойти не знаю, точнее не понимаю, чего от меня хотят. Возможно кто то...

Создать dll и вернуть из функции значение строки
вообщем надо на си сделать отдельную длл и вернуть значение а как не умею обьясните

Как вернуть значение (int) из созданной dll?
Есть набор форм, которые я сделал в виде dll. Внутри этой dll расположено дерево, со значениями: В другом проекте используется эта...

Как вернуть параметр атрибута из сборки .dll?
Здравствуйте! У меня есть сборка с тестами .dll, некоторые тесты отмечены Nunit атрибутом public void test() {}Мне нужно...

Как из c++ dll функции вернуть RGB\ARGB цвет?
Есть функция в ней есть переменная цвета типа COLORREF Подскажите, кто знает, каким образом можно вернуть значение этой переменной(то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru