![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| alex87 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.2.2008 Репутация: нет Всего: нет |
Доброго времени суток.
Есть проблема c работой векторов совместно с dll
Но после того, как делаю вызов этой функции из программы :
выкидывает : ![]() Вот такая проблемка, не знаю что делать, до этого использовал сишные строки и всё работало. Может кто подскажет ответ? dll написана под visual studio 6.0 , вызывается из CBuilder6. |
||||
|
|||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Скорее всего вязанка и билдер используют разные версии STL. так что не стоит передавать std::string'и да std::vector'а. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| alex87 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.2.2008 Репутация: нет Всего: нет |
http://forums.microsoft.com/MSDN/ShowPost....70&SiteID=1 - нашел кое-что, но я слабо понимаю о чём они там пишут. |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Вот тебе и ответ...
Это сообщение отредактировал(а) andrew_121 - 6.3.2008, 15:02 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| alex87 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.2.2008 Репутация: нет Всего: нет |
Я же говорю - слабо понимаю английский, да и вообще кто-нибудь объяснит о чём тут написано? Тестирую dll под вижуалом - всё работает - значит всё -таки проблема с совместимостью STL в билдере и вижуале Это сообщение отредактировал(а) alex87 - 6.3.2008, 15:11 |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Неплохой онлайн переводчик
Особенно хорошая особенность tr1::shared_ptr есть, что это автоматически использует его за-указатель deleter, чтобы исключить другую ошибку потенциального клиента, "Проблема ПЕРЕСЕЧЕНИЕ-DLL." Эта проблема собирает урожай выше того, когда объект создан, используя новым в одном динамически связал библиотеку (DLL) но удаляется в различном DLL. На многих платформах, такие ПЕРЕСЕЧЕНИЕ-DLL пары новости/удаления приводят к ошибкам во время выполнения. tr1:;shared_ptr избегает проблемы, потому что его заданный по умолчанию deleter использует удаление из того же DLL, где tr1::shared_ptr создан. Так, я мог изменить свой код такое, что все размещения и вычеркивания появляются или в клиента, или DLL но не как, так и передают общий указатель, чтобы пересечь границу. Я havent пробовал это еще но будет скоро. Плохо вероятно использовать увеличение общий указатель. Имен устройств Visual Studio обеспечивает любой tr1 материал? За осмысловку не отвечаю. Это сообщение отредактировал(а) andrew_121 - 6.3.2008, 15:49 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| alex87 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.2.2008 Репутация: нет Всего: нет |
Спасибо ;)
|
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Я заметил, но решил оставить, так, для прикола... -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Нет, решение не в этом.
Нужно, чтобы и Exe и DLL использовали один и тот же экземпляр Run-time библиотеки (потому что там живут статические переменные, которые управляют кучей). Т.е. run-time тоже должна быть динамической (и одинаковой для всех модулей - в смысле дебажности и мультитредности). Тогда C-куча будет общая. А так - возникают проблемы, когда удаление происходит не в том модуле, где было выделение памяти, что у тебя, скорее всего и есть. Второй вариант (менее удобный) - писать так, чтобы создание\удаление гарантированно происходило в одном модуле. Т.е. что-то типа оберток CreateVector\DeleteVector. Собственно, примерно это и написано в приведенной цитате (если читать оригинал). Естественно, с малыми объектами - замучаешься. Да и использовать для обертки вектора shared-Ptr - масло масленное. Проще добиться нормальной линковки с Run-Time DLL. -------------------- ... |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| alex87 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.2.2008 Репутация: нет Всего: нет |
С объектами всё работало, речь идёт о реализации внутри объекта . |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
не будет у тебя так организованная dll работать нормально. 1.В интерфейсе либы нужно использовать переносимые типы (ты же не можешь передать std::vector из С) 2.Нужно избегать выделения и освобождения памяти в разных модулях ( создание std::string и передача из фунции в приложение, где он будет разрушен(ЧПОК!!! из-за разных CRT) ) Принципиально можно сделать так как у тебя, но работать нормально будет только если и приложение и dll собраны одной версией компилятора, с одинаковыми настройками и одними и темиже реализациями используемых либ (STL и пр.) |
|||
|
||||
| alex87 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.2.2008 Репутация: нет Всего: нет |
Ну всё правильно : у меня string в интрефейсе, поэтому и не работало. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |