11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
|
|
1 | |
Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4)25.06.2014, 19:15. Показов 1013. Ответов 19
Метки нет (Все метки)
Здравствуйте! Есть такая ситуация: в приложении происходит вызов функции из библиотеки, в которую надо передать vector<wchar_t*>*.
Когда это происходит, в библиотеку приходит ссылка на не пойми что, т.е. пользоваться этим невозможно. Как так портятся указатели? И как быть? Мои предположения никак мне не помогли, да и в инете тоже не густо ... Далее, когда мы передадим все-таки это, у нас в длл есть ссылка на функцию из приложения, аргумент у которой тот же вектор. Т.е. здесь реализована идея события, которое происходит в длл, и передает vector<wchar_t*>* в приложение для дальнейшей обработки. Само событие происходит, просто опять портится ссылка на вектор и содержимое. Когда все написано на билдере - все работает, но вот билдер и vc++ - нет.
0
|
25.06.2014, 19:15 | |
Ответы с готовыми решениями:
19
Динамическое подключение VC++ (2012) DLL в приложении C++Builder (RAD XE5) Embarcadero RAD Studio C++ Builder XE4 RAD Studio XE4 и компоненты для Builder Работа с объектами в C++ Builder 2010 (RAD 2010) |
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
25.06.2014, 19:25 | 2 |
1
|
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
|
|
25.06.2014, 19:27 | 3 |
Реализация класса vector разная, наверное. Не надо вообще такое передавать за пределы программы.
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
25.06.2014, 19:33 | 4 |
Да, и еще надо иметь в виду, что даже для POD типов, память отведенная в приложении, должна освобождаться в приложении и наоборот - память отведенная в dll, должна освобождаться в dll
0
|
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
|
|
25.06.2014, 21:04 [ТС] | 5 |
Да ... правда даже wchar_t* и char* не передаются.
Добавлено через 1 минуту Так я уже догадался, что вектор м.б. имеет разную реализацию, просто на всякий случай написал)
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
26.06.2014, 03:49 | 6 |
Почему? Указатели должны нормально передаваться. Нельзя отводить память в одном модуле, а освобождать в другом - у них менеджеры памяти у каждого свой.
0
|
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
|
||||||
26.06.2014, 15:00 [ТС] | 7 | |||||
Так, в первом месте работает, а вот в другом - нет.
Код в длл:
0
|
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
|
|
26.06.2014, 15:19 | 8 |
Прототип у функции как выглядит и зачем здесь delete, если new не было? И лучше наверное так не объявлять строку, она будет с ограничениями на модификацию.
0
|
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
|
|||||||||||
26.06.2014, 15:26 [ТС] | 9 | ||||||||||
А блин, до этого было new, прост не удалил.
В длл:
Модификация не нужна.
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
26.06.2014, 15:28 | 10 |
Поясните.
Я правильно понимаю, что в dll Вы пытаетесь вызвать функцию, реализованную в приложении? Каким образом передается указатель?
0
|
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
|
||||||
26.06.2014, 15:52 [ТС] | 11 | |||||
Да, правильно.
Пока вот так:
Ура! Я нашел решение!!! Нужно было создать просто функцию, которая не является членом класса. Тогда можно обойтись без __closure и все работает!!!
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
26.06.2014, 17:18 | 12 |
0
|
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
|
|
28.06.2014, 18:20 [ТС] | 14 |
Ну ... не уследил немного ...
И всякий раз, когда говорят про чистый си, так и хочется найти другое решение ...
0
|
28.06.2014, 18:36 | 15 | |||||
Использовать внутри ф-ции можно что угодно, но интерфейс dll-ки должен быть сишным, ну и в добавок - выделять/освобождать память нужно либо только в DLL либо только в программе, нельзя выделить в DLL и вернуть указатель на нее и освободить во вне.
Добавлено через 9 минут Т.е применительно к твоей задачи можно сделать преобразование vector<wstring> -> vector<wchar_t> а затем передавать как "сполошной пласт" в ф-цию
0
|
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
|
||||||
28.06.2014, 18:45 [ТС] | 16 | |||||
Я уже решил сделать через
0
|
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
|
|
29.06.2014, 14:33 [ТС] | 18 |
Почему?
Между библиотекой и приложением надо будет передавать несколько строк, которые задаются константно. В чем проблема?
0
|
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
|
|
29.06.2014, 14:53 [ТС] | 20 |
Так там и так фиксированный, менять не нужно.
0
|
29.06.2014, 14:53 | |
29.06.2014, 14:53 | |
Помогаю со студенческими работами здесь
20
Переход с Builder 6 на Rad 2010 Компоненты из Builder 6 в RAD Studio 2010 клиент на VS++ 2010 сервер на RAD Studio C++Builder Очень медленная компиляция в RAD Builder c++ 2010 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |