Аватар для Argus19
1435 / 452 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23

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

02.02.2020, 12:54. Показов 5224. Ответов 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
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.02.2020, 19:45
Студворк — интернет-сервис помощи студентам
DestroyWindow() так же работает?
0
 Аватар для Argus19
1435 / 452 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23
06.02.2020, 22:21  [ТС]
Определил с помощью GetConsoleProcessList PID процесса. Он соответствует программе, вызывающей .dll.

Добавлено через 12 минут
Цитата Сообщение от Avazart Посмотреть сообщение
DestroyWindow() так же работает?
Нет. Работает только SendMessage.

Добавлено через 2 часа 11 минут
Правильно срабатывает:
C++
1
FreeConsole();
Так же это находится в деструкторе. А, как вызвать деструктор, я не знаю.
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
29.02.2020, 09:26
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Ещё есть такое понятие, как маршалинг. Но я сам не крутил, не подскажу
к #7:
насколько я поняла, его крутить не надо -
там по вашему линку так и сказано:
To save any marshaled values, you must copy the values to your own variables.
и приведены from - to какие типы в какие могут переводиться...
т.е. копируем с указателя in-value (внутри самой dll) ==> в variable, работаем с variable, потом ==> результат обратно присваиваем указателю out-value ==> его и возвращаем, т.е. результат... - но по сути этот указатель, куда помещаем результат, уже изначально законнектен на приложение (источник входных данных и приёмник результата от dll) --- вроде такова суть ATL-библиотек
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
29.02.2020, 18:35
не там запостила про COMdll BSTR use - оставлю линк здесь - там после =============

Добавлено через 16 минут
Цитата Сообщение от Argus19 Посмотреть сообщение
Уничтожается ли строка при выходе из .dll?
вообще-то вы её, вероятно, хотите вернуть на клиент (своё приложение) с сервера (сама dll)...
прстенький пример в IDE Ultimate++ C++v.11
dllmy.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef _dllmy_dllmy_h
#define _dllmy_dllmy_h
 
#if defined (__cplusplus)
extern "C"
{
#endif
  __declspec(dllexport) double simpleVersion();
#if defined (__cplusplus)
}
#endif
 
#endif    //FEET_H

dllmy.cpp
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
#include <windows.h>
#include "dllmy.h"
 
BOOL WINAPI DllMain (HANDLE hModule, DWORD reason,  LPVOID lpReserved)
{
    switch (reason) {
    case DLL_PROCESS_ATTACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    }
    return TRUE;
}
 
const double version = 2.5;
 
double  simpleVersion() {
    //cout << version << endl;
    return version;
}

dll_use.cpp
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
36
37
38
39
#include <iostream>
#include <windows.h>
 
using namespace std;
 
typedef double(__cdecl *MYPROC)();     //тип
MYPROC ProcAddress;    // переменная этого типа
 
int main(int argc, const char *argv[])
 
{
    double x;   //for not to exitcode  - to see Console
    //load lib     
    HINSTANCE dll_handle = LoadLibrary("C:\\upp\\out\\MyApps\\MINGW.Debug.Debug_Full.Dll.Noblitz\\dllmy.dll");
        if (!dll_handle) {
            cerr << "Unable to load DLL!\n" << endl;
            return 1;
        }
        else if (dll_handle) {
             cout << "dll loaded!\n" << endl;
             
            //load function - get pointer to it
             ProcAddress=(MYPROC)GetProcAddress(dll_handle, "simpleVersion");
             if (ProcAddress != NULL) {
             cout << "simpleVersion() Function ADDRESS have got...\n" << endl;
             cout << ProcAddress() << endl; //load result of function
                 cout <<  "\n"<< endl;
            }
            // free dyn library
            if (dll_handle) {
            cout << "dll free lib..." << endl;
                FreeLibrary(dll_handle);
            cout << "dll freelib. done!" << endl;
        }
        }
 
    cin >> x;   //for not to exitcode  - to see Console
    return 0;
}

здесь правда на C++ и сервер, и клиент И передаётся double... но по передаче строк я ещё подумаю... (как подправить)
1
 Аватар для Argus19
1435 / 452 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23
29.02.2020, 18:53  [ТС]
JeyCi, всё уже решено и работает.
Спасибо за дополнения. Посмотрю позже. Сейчас продолжаю "мастерить" библиотеку дальше.
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
02.03.2020, 08:44
вообще, хорошее описание подходов к передаче строк в DLL - здесь (правда delphi - но линк оставлю)... для вывода по теме

Добавлено через 14 минут
просто нюанс:
Дельфийские строки передавать в DLL нельзя (можно только на чтение), т.к. менеджеры памяти разные... если идёт модификация - Вылез за пределы 128 и всё...
- поэтому используется ход конём по линку....
не знаю, есть ли такая проблема в VB6 при использовании с С++... но на заметку линк оставила...
1
 Аватар для Argus19
1435 / 452 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23
02.03.2020, 19:27  [ТС]
JeyCi, в функцию С++ передаётся адрес буфера и его размер по
Visual Basic
1
ByRef
и в функции заполняем его строкой
C++
1
2
3
bool _stdcall mytext (char *buffer, int* buffer_size)
const std::string s = "строка текста";
strcpy(buffer,s.c_str());
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.03.2020, 19:27
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Опции темы

Новые блоги и статьи
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru