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

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

Войти
Регистрация
Восстановить пароль
 
VV_RIP
9 / 8 / 1
Регистрация: 05.02.2012
Сообщений: 105
25.06.2014, 19:15     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #1
Здравствуйте! Есть такая ситуация: в приложении происходит вызов функции из библиотеки, в которую надо передать vector<wchar_t*>*.
Когда это происходит, в библиотеку приходит ссылка на не пойми что, т.е. пользоваться этим невозможно. Как так портятся указатели? И как быть? Мои предположения никак мне не помогли, да и в инете тоже не густо ...

Далее, когда мы передадим все-таки это, у нас в длл есть ссылка на функцию из приложения, аргумент у которой тот же вектор. Т.е. здесь реализована идея события, которое происходит в длл, и передает vector<wchar_t*>* в приложение для дальнейшей обработки.
Само событие происходит, просто опять портится ссылка на вектор и содержимое.
Когда все написано на билдере - все работает, но вот билдер и vc++ - нет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
uglyPinokkio
325 / 228 / 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
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
25.06.2014, 19:27     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #3
Реализация класса vector разная, наверное. Не надо вообще такое передавать за пределы программы.
uglyPinokkio
325 / 228 / 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
325 / 228 / 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
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
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
325 / 228 / 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
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 17:18     Указатели в VC++ (2010) DLL и в приложении C++Builder (RAD XE4) #12
Цитата Сообщение от VV_RIP Посмотреть сообщение
Нужно было создать просто функцию, которая не является членом класса.
Можно статический метод класса, но это уже не имеет никакого отношения к dll.
Avazart
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,778
Записей в блоге: 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
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,778
Записей в блоге: 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
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,778
Записей в блоге: 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
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,778
Записей в блоге: 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++ Написать программу сортировки через указатели на указатели
C++ Указатели на слонов или А зачем нужны указатели?
Отсортировать массив и вывести на экран (массивы и указатели на указатели) C++
C++ Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Используются ли на практике указатели на указатели объектов? 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)
Ответ Создать тему
Опции темы

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