Форум программистов, компьютерный форум 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. Просмотров 583. Ответов 19
Метки нет (Все метки)

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

Далее, когда мы передадим все-таки это, у нас в длл есть ссылка на функцию из приложения, аргумент у которой тот же вектор. Т.е. здесь реализована идея события, которое происходит в длл, и передает vector<wchar_t*>* в приложение для дальнейшей обработки.
Само событие происходит, просто опять портится ссылка на вектор и содержимое.
Когда все написано на билдере - все работает, но вот билдер и vc++ - нет.
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)
Тема: Разработка приложений в среде «Embarcadero RAD Studio 2010» C++
Программа которую написали в Embarcadero Rad Studio 10 откроется в C++ Builder 6? C++
C++ DLL компилируется, но не вызывается в приложении C#
DLL 32 и 64 в C++ 2010 C++
Что лучше Visual studio 2010 C++ или Builder 6 C++ ? C++
C++ Подключение dll в MSVS 2010 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
25.06.2014, 19:25     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #2
Цитата Сообщение от VV_RIP Посмотреть сообщение
Здравствуйте! Есть такая ситуация: в приложении происходит вызов функции из библиотеки, в которую надо передать vector<wchar_t*>*.
На этом можно закончить . Переделывайте интерфейс dll на плоский C.
nmcf
5113 / 4433 / 1474
Регистрация: 14.04.2014
Сообщений: 17,571
25.06.2014, 19:27     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #3
Реализация класса vector разная, наверное. Не надо вообще такое передавать за пределы программы.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
25.06.2014, 19:33     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #4
Да, и еще надо иметь в виду, что даже для POD типов, память отведенная в приложении, должна освобождаться в приложении и наоборот - память отведенная в dll, должна освобождаться в dll
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
25.06.2014, 21:04  [ТС]     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #5
Да ... правда даже wchar_t* и char* не передаются.

Добавлено через 1 минуту
Так я уже догадался, что вектор м.б. имеет разную реализацию, просто на всякий случай написал)
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 03:49     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #6
Цитата Сообщение от VV_RIP Посмотреть сообщение
char* не передаются.
Почему? Указатели должны нормально передаваться. Нельзя отводить память в одном модуле, а освобождать в другом - у них менеджеры памяти у каждого свой.
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
26.06.2014, 15:00  [ТС]     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #7
Так, в первом месте работает, а вот в другом - нет.
Код в длл:
C++
1
2
3
    wchar_t* str = L"Lol";
    CallToOther(str);//ссылка на функцию из приложения
    delete str;
Когда идет вызов функции, в приложение приходит пустая строка.
nmcf
5113 / 4433 / 1474
Регистрация: 14.04.2014
Сообщений: 17,571
26.06.2014, 15:19     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #8
Прототип у функции как выглядит и зачем здесь delete, если new не было? И лучше наверное так не объявлять строку, она будет с ограничениями на модификацию.
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
26.06.2014, 15:26  [ТС]     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #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 секунд
Модификация не нужна.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 15:28     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #10
Поясните.

Цитата Сообщение от VV_RIP Посмотреть сообщение
Код в длл:
Цитата Сообщение от VV_RIP Посмотреть сообщение
CallToOther(str);//ссылка на функцию из приложения
Я правильно понимаю, что в dll Вы пытаетесь вызвать функцию, реализованную в приложении?
Каким образом передается указатель?
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
26.06.2014, 15:52  [ТС]     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #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 и все работает!!!
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 17:18     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #12
Цитата Сообщение от VV_RIP Посмотреть сообщение
Нужно было создать просто функцию, которая не является членом класса.
Можно статический метод класса, но это уже не имеет никакого отношения к dll.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,274
Записей в блоге: 17
26.06.2014, 18:02     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #13
VV_RIP Ну нельзя так работать... вам же сказали что нужно делать только в стиле си
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
28.06.2014, 18:20  [ТС]     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #14
Ну ... не уследил немного ...
И всякий раз, когда говорят про чистый си, так и хочется найти другое решение ...
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,274
Записей в блоге: 17
28.06.2014, 18:36     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #15
Использовать внутри ф-ции можно что угодно, но интерфейс dll-ки должен быть сишным, ну и в добавок - выделять/освобождать память нужно либо только в DLL либо только в программе, нельзя выделить в DLL и вернуть указатель на нее и освободить во вне.

Добавлено через 9 минут
Т.е применительно к твоей задачи можно сделать преобразование
vector<wstring> -> vector<wchar_t> а затем передавать как "сполошной пласт" в ф-цию
C++
1
size_t  some(wchar_t* buf, size_t length);
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
28.06.2014, 18:45  [ТС]     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #16
Я уже решил сделать через
C++
1
wchar_t**
это решает проблемы)
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,274
Записей в блоге: 17
28.06.2014, 20:39     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #17
Цитата Сообщение от VV_RIP Посмотреть сообщение
это решает проблемы)
Сомнительно.
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
29.06.2014, 14:33  [ТС]     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #18
Почему?
Между библиотекой и приложением надо будет передавать несколько строк, которые задаются константно. В чем проблема?
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,274
Записей в блоге: 17
29.06.2014, 14:38     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #19
Есть сомнения в правильном реализации сего.
Кроме того придется фиксировать размер строк
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2014, 14:53     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4)
Еще ссылки по теме:
C++ Создание .dll в MSVC 2010 в чем ошибка?
Указатели и указатели на указатели, а также типы данных C++
C++ Через указатели на указатели посчитать сумму двух чисел и записать в третье
C++ Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? C++

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

Или воспользуйтесь поиском по форуму:
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
29.06.2014, 14:53  [ТС]     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #20
Так там и так фиксированный, менять не нужно.
Yandex
Объявления
29.06.2014, 14:53     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4)
Ответ Создать тему
Опции темы

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