Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 106
#1

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

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

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

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

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

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

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

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

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

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

Добавлено через 1 минуту
Так я уже догадался, что вектор м.б. имеет разную реализацию, просто на всякий случай написал)
0
uglyPinokkio
326 / 229 / 55
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 03:49 #6
Цитата Сообщение от VV_RIP Посмотреть сообщение
char* не передаются.
Почему? Указатели должны нормально передаваться. Нельзя отводить память в одном модуле, а освобождать в другом - у них менеджеры памяти у каждого свой.
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 106
26.06.2014, 15:00  [ТС] #7
Так, в первом месте работает, а вот в другом - нет.
Код в длл:
C++
1
2
3
    wchar_t* str = L"Lol";
    CallToOther(str);//ссылка на функцию из приложения
    delete str;
Когда идет вызов функции, в приложение приходит пустая строка.
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
26.06.2014, 15:19 #8
Прототип у функции как выглядит и зачем здесь delete, если new не было? И лучше наверное так не объявлять строку, она будет с ограничениями на модификацию.
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 106
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 / 55
Регистрация: 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
Сообщений: 106
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 / 55
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 17:18 #12
Цитата Сообщение от VV_RIP Посмотреть сообщение
Нужно было создать просто функцию, которая не является членом класса.
Можно статический метод класса, но это уже не имеет никакого отношения к dll.
0
Avazart
Эксперт С++
7718 / 5627 / 549
Регистрация: 10.12.2010
Сообщений: 25,333
Записей в блоге: 17
26.06.2014, 18:02 #13
VV_RIP Ну нельзя так работать... вам же сказали что нужно делать только в стиле си
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 106
28.06.2014, 18:20  [ТС] #14
Ну ... не уследил немного ...
И всякий раз, когда говорят про чистый си, так и хочется найти другое решение ...
0
Avazart
Эксперт С++
7718 / 5627 / 549
Регистрация: 10.12.2010
Сообщений: 25,333
Записей в блоге: 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
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 106
28.06.2014, 18:45  [ТС] #16
Я уже решил сделать через
C++
1
wchar_t**
это решает проблемы)
0
Avazart
Эксперт С++
7718 / 5627 / 549
Регистрация: 10.12.2010
Сообщений: 25,333
Записей в блоге: 17
28.06.2014, 20:39 #17
Цитата Сообщение от VV_RIP Посмотреть сообщение
это решает проблемы)
Сомнительно.
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 106
29.06.2014, 14:33  [ТС] #18
Почему?
Между библиотекой и приложением надо будет передавать несколько строк, которые задаются константно. В чем проблема?
0
Avazart
Эксперт С++
7718 / 5627 / 549
Регистрация: 10.12.2010
Сообщений: 25,333
Записей в блоге: 17
29.06.2014, 14:38 #19
Есть сомнения в правильном реализации сего.
Кроме того придется фиксировать размер строк
0
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 106
29.06.2014, 14:53  [ТС] #20
Так там и так фиксированный, менять не нужно.
0
29.06.2014, 14:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2014, 14:53

Embarcadero RAD Studio C++ Builder XE4
XE4 Кстати поделитесь опытом, создавал ли кто-то приложения на FMX...

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

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


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

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

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