Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
1

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

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

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

Далее, когда мы передадим все-таки это, у нас в длл есть ссылка на функцию из приложения, аргумент у которой тот же вектор. Т.е. здесь реализована идея события, которое происходит в длл, и передает vector<wchar_t*>* в приложение для дальнейшей обработки.
Само событие происходит, просто опять портится ссылка на вектор и содержимое.
Когда все написано на билдере - все работает, но вот билдер и vc++ - нет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2014, 19:15
Ответы с готовыми решениями:

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

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

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

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

19
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
25.06.2014, 19:25 2
Цитата Сообщение от VV_RIP Посмотреть сообщение
Здравствуйте! Есть такая ситуация: в приложении происходит вызов функции из библиотеки, в которую надо передать vector<wchar_t*>*.
На этом можно закончить . Переделывайте интерфейс dll на плоский C.
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
Цитата Сообщение от VV_RIP Посмотреть сообщение
char* не передаются.
Почему? Указатели должны нормально передаваться. Нельзя отводить память в одном модуле, а освобождать в другом - у них менеджеры памяти у каждого свой.
0
11 / 10 / 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
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, прост не удалил.
В длл:
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
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 15:28 10
Поясните.

Цитата Сообщение от VV_RIP Посмотреть сообщение
Код в длл:
Цитата Сообщение от VV_RIP Посмотреть сообщение
CallToOther(str);//ссылка на функцию из приложения
Я правильно понимаю, что в dll Вы пытаетесь вызвать функцию, реализованную в приложении?
Каким образом передается указатель?
0
11 / 10 / 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
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 17:18 12
Цитата Сообщение от VV_RIP Посмотреть сообщение
Нужно было создать просто функцию, которая не является членом класса.
Можно статический метод класса, но это уже не имеет никакого отношения к dll.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.06.2014, 18:02 13
VV_RIP Ну нельзя так работать... вам же сказали что нужно делать только в стиле си
0
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
28.06.2014, 18:20  [ТС] 14
Ну ... не уследил немного ...
И всякий раз, когда говорят про чистый си, так и хочется найти другое решение ...
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
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
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
28.06.2014, 18:45  [ТС] 16
Я уже решил сделать через
C++
1
wchar_t**
это решает проблемы)
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.06.2014, 20:39 17
Цитата Сообщение от VV_RIP Посмотреть сообщение
это решает проблемы)
Сомнительно.
0
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
29.06.2014, 14:33  [ТС] 18
Почему?
Между библиотекой и приложением надо будет передавать несколько строк, которые задаются константно. В чем проблема?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2014, 14:38 19
Есть сомнения в правильном реализации сего.
Кроме того придется фиксировать размер строк
0
11 / 10 / 1
Регистрация: 05.02.2012
Сообщений: 106
29.06.2014, 14:53  [ТС] 20
Так там и так фиксированный, менять не нужно.
0
29.06.2014, 14:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2014, 14:53
Помогаю со студенческими работами здесь

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

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

клиент на VS++ 2010 сервер на RAD Studio C++Builder
Пытаюсь осуществить работу автоматизации между сервером, написанным на RAD Studio ХЕ C++Builder, и...

Очень медленная компиляция в RAD Builder c++ 2010
В общем что-то переклинило в студии и стало компилить по 2-3 минуты. Проц не грузит. Просто долго...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru