Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
#1

Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) - C++

25.06.2014, 19:15. Просмотров 623. Ответов 19
Метки нет (Все метки)

Здравствуйте! Есть такая ситуация: в приложении происходит вызов функции из библиотеки, в которую надо передать vector<wchar_t*>*.
Когда это происходит, в библиотеку приходит ссылка на не пойми что, т.е. пользоваться этим невозможно. Как так портятся указатели? И как быть? Мои предположения никак мне не помогли, да и в инете тоже не густо ...

Далее, когда мы передадим все-таки это, у нас в длл есть ссылка на функцию из приложения, аргумент у которой тот же вектор. Т.е. здесь реализована идея события, которое происходит в длл, и передает vector<wchar_t*>* в приложение для дальнейшей обработки.
Само событие происходит, просто опять портится ссылка на вектор и содержимое.
Когда все написано на билдере - все работает, но вот билдер и vc++ - нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2014, 19:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) (C++):

Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) - C++
Здравствуйте! Вроде бы подобные темы бывали, но я так и не смог понять, что не так, т.к. редко пишу на с++. Вот код в библиотеке VC++:...

Тема: Разработка приложений в среде «Embarcadero RAD Studio 2010» - C++
Задана матрица размером NxM. Определить k – количество «особых» элементов матрицы, считая элемент «особым», если он больше суммы остальных...

Программа которую написали в Embarcadero Rad Studio 10 откроется в C++ Builder 6? - C++
Программа которую написали в Embarcadero Rad Studio 10 откроется в C++ Builder 6?

DLL компилируется, но не вызывается в приложении C# - C++
Здравствуйте, есть DLL, компилируется без ошибок, но вызвать из C# её не получается, вот код: #define _CRT_SECURE_NO_WARNINGS ...

DLL 32 и 64 в C++ 2010 - C++
Написал простой dll, откомпилировал его в VC 2010 подключаю к матлабу, который ругается что dll создан 32 битным компилятором, а нужен 64...

Embarcadero RAD Studio C++ Builder XE4 - C++ Builder
XE4 Кстати поделитесь опытом, создавал ли кто-то приложения на FMX (FireMonkey) , лучше ли она VCL, так как понимаю только FMX...

19
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
25.06.2014, 19:25 #2
Цитата Сообщение от VV_RIP Посмотреть сообщение
Здравствуйте! Есть такая ситуация: в приложении происходит вызов функции из библиотеки, в которую надо передать vector<wchar_t*>*.
На этом можно закончить . Переделывайте интерфейс dll на плоский C.
1
nmcf
5353 / 4673 / 1564
Регистрация: 14.04.2014
Сообщений: 18,627
25.06.2014, 19:27 #3
Реализация класса vector разная, наверное. Не надо вообще такое передавать за пределы программы.
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
25.06.2014, 19:33 #4
Да, и еще надо иметь в виду, что даже для POD типов, память отведенная в приложении, должна освобождаться в приложении и наоборот - память отведенная в dll, должна освобождаться в dll
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
25.06.2014, 21:04  [ТС] #5
Да ... правда даже wchar_t* и char* не передаются.

Добавлено через 1 минуту
Так я уже догадался, что вектор м.б. имеет разную реализацию, просто на всякий случай написал)
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 03:49 #6
Цитата Сообщение от VV_RIP Посмотреть сообщение
char* не передаются.
Почему? Указатели должны нормально передаваться. Нельзя отводить память в одном модуле, а освобождать в другом - у них менеджеры памяти у каждого свой.
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
26.06.2014, 15:00  [ТС] #7
Так, в первом месте работает, а вот в другом - нет.
Код в длл:
C++
1
2
3
    wchar_t* str = L"Lol";
    CallToOther(str);//ссылка на функцию из приложения
    delete str;
Когда идет вызов функции, в приложение приходит пустая строка.
0
nmcf
5353 / 4673 / 1564
Регистрация: 14.04.2014
Сообщений: 18,627
26.06.2014, 15:19 #8
Прототип у функции как выглядит и зачем здесь delete, если new не было? И лучше наверное так не объявлять строку, она будет с ограничениями на модификацию.
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
26.06.2014, 15:26  [ТС] #9
А блин, до этого было new, прост не удалил.
В длл:
C++
1
2
    wchar_t* str = L"Lol";
    CallToOther(str);
Сама функция:
C++
1
2
3
4
void __stdcall Starter::CallToVC(wchar_t* command)
{
    UnicodeString us = command;//EAccessViolation
}
Добавлено через 49 секунд
Модификация не нужна.
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 15:28 #10
Поясните.

Цитата Сообщение от VV_RIP Посмотреть сообщение
Код в длл:
Цитата Сообщение от VV_RIP Посмотреть сообщение
CallToOther(str);//ссылка на функцию из приложения
Я правильно понимаю, что в dll Вы пытаетесь вызвать функцию, реализованную в приложении?
Каким образом передается указатель?
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
26.06.2014, 15:52  [ТС] #11
Да, правильно.
Пока вот так:
C++
1
2
3
4
5
6
        HINSTANCE hi_dll = LoadLibrary(path.w_str());
        void (__stdcall *Init) (HINSTANCE, void(__closure __stdcall *CallTo)(wchar_t* command));
        Init = (void(__stdcall *) (HINSTANCE, void(__closure __stdcall *CallTo)(wchar_t* command)))
            GetProcAddress(hi_dll, "Init");
        if(Init)
            Init(hi_dll, CallToVC);
Добавлено через 16 минут
Ура! Я нашел решение!!!
Нужно было создать просто функцию, которая не является членом класса. Тогда можно обойтись без __closure и все работает!!!
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 17:18 #12
Цитата Сообщение от VV_RIP Посмотреть сообщение
Нужно было создать просто функцию, которая не является членом класса.
Можно статический метод класса, но это уже не имеет никакого отношения к dll.
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,951
Записей в блоге: 17
26.06.2014, 18:02 #13
VV_RIP Ну нельзя так работать... вам же сказали что нужно делать только в стиле си
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
28.06.2014, 18:20  [ТС] #14
Ну ... не уследил немного ...
И всякий раз, когда говорят про чистый си, так и хочется найти другое решение ...
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,951
Записей в блоге: 17
28.06.2014, 18:36 #15
Использовать внутри ф-ции можно что угодно, но интерфейс dll-ки должен быть сишным, ну и в добавок - выделять/освобождать память нужно либо только в DLL либо только в программе, нельзя выделить в DLL и вернуть указатель на нее и освободить во вне.

Добавлено через 9 минут
Т.е применительно к твоей задачи можно сделать преобразование
vector<wstring> -> vector<wchar_t> а затем передавать как "сполошной пласт" в ф-цию
C++
1
size_t  some(wchar_t* buf, size_t length);
0
28.06.2014, 18:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2014, 18:36
Привет! Вот еще темы с ответами:

RAD Studio XE4 и компоненты для Builder - C++ Builder
Есть набор компонент в исходниках и проектах. Для разных версий студии. Как принято в наборах компонент, имена проектов отличаются версией,...

Работа с объектами в C++ Builder 2010 (RAD 2010) - C++ Builder
Плавно перехожу на программирование в Builder, появляется очень много вопросов по работе со стандартными встроенными объектами (формами). ...

Переход с Builder 6 на Rad 2010 - C++ Builder
Всем добрый вечер, ребята возникла проблема, можно проэкты которые написаны изначально были на C++ Builder 6 безболезненно продолжить...

Компоненты из Builder 6 в RAD Studio 2010 - C++ Builder
Доброго времени суток! Столкнулся с такой проблемой! В приложении которое разрабатывалось уже давненько на Builder 6, используются два...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru