Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с STL vector, исключение в STL 
V
    Опции темы
mantissa
Дата 30.11.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.10.2007

Репутация: 1
Всего: 1



Привет, Fazil6 !

Цитата

надо не сингл, НАДО ЧТОБЫ ЭТОТ ПАРАМЕТР БЫЛ ОДИНАКОВЫЙ У ВСЕХ, у ддл и у ехе


были разные, теперь один... не помогает...
Цитата

использовать в ехе и dll один компиллятор, одной и той же версии с одинаковыми настройками.


дык один он... это вообще один Solution, в который включены 2 проекта (или как там они у него обзываются)....
да и на мой взгляд необходимости в DLL-ке вроде нет.... просто мой предшественник все, что относилось к ESQL/C решил засунуть в DLL

а почему передача параметров в DLL плохая идея и чем ссылка на объект хуже например указателя на строку?

а функции стараюсь писать универсальные, чтобы действительно эту DLL  м. было другими EXE-шниками использовать

и на мой взгляд проще передать объект, чтобы некто там напихал в него данные, используя его же методы, вместо того, чтобы пихать в объект методы, которые используют вызовы множества ESQL/C функций

стоп...
перейдем к конкретному примеру....
мне нужно отобразить содержимое файла, хранящееся в БД в BLOB-е и некоторые значения полей таблиц
рассмотрим варианты...
имеется универсальная функция уже написанная и откомпилированная...
 ты...
      1) просто ее вызовешь с необходимыми параметрами?
      2) скопируешь ее код в свой проект?
      3) напишешь нечто очень похожее, но свое?

как бы ты сам написал эту функцию?
  1) передал бы ей кучу хэндлов на окна и пущай в них сама все вставляет
  2) забрал бы от нее все данные в статические буфера (для BLOB например 1000К или больше) и сам бы повставлял данные
  3) то же но с динамическими буферами (string, vector и т.д.) (кстати вариант там распределять память, а здесь при закрытии окна освобождать - также не проходит по тем же причинам, приходиться выполнять лишние запросы для уточнения размеров)

поделись плиз логикой...

с ув. BSD
 
PM MAIL   Вверх
Fazil6
Дата 30.11.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 3
Всего: 60



Цитата(mantissa @  30.11.2007,  17:10 Найти цитируемый пост)
а почему передача параметров в DLL плохая идея и чем ссылка на объект хуже например указателя на строку?

я говорил о объектах классов. Если у тебя в интерфейсе dll функция, которая в качестве праметра принимает к примеру std::map,  то как ты эту функцию будешь вызывать, скажем, в Delphi ? Причем, не факт даже, что программа компиллируемая С++ компиллятором всегда сможет работать с такой dll, просто потому что использует какую-нибудь другую версию STL, потому что объект std::list создаваемый ею отличается в силу особеностей компиллятора от объекта создаваемого компиллятором dll. Объект класса - это ведь не int какой-нибудь.
Цитата(mantissa @  30.11.2007,  17:10 Найти цитируемый пост)
а функции стараюсь писать универсальные, чтобы действительно эту DLL  м. было другими EXE-шниками использовать

для этой цели нужно использовать переносимые типы в интерфейсе dll. Использование классов резко сужает область применимости такой библиотеки.
Цитата(mantissa @  30.11.2007,  17:10 Найти цитируемый пост)
и на мой взгляд проще передать объект, чтобы некто там напихал в него данные, используя его же методы, вместо того, чтобы пихать в объект методы, которые используют вызовы множества ESQL/C функций

см. выше. 
Для того чтобы напихать в твой объект вызывающий должен знать что это такое и правильно его использовать

насчет задачи твоей... Постановка слишком неконкретная. Впринципе возможны любые из приведенных тобой вариантов. Причем здесь dll? Если уж рассматривать некие варианты, то если есть некая либа, которая инкапсулирует, допустим, работу с БД, то функция чтения значения из BLOB записывала бы результат в некий буфер unsigned char* но это далеко не единственное возможное и приемлемое решение. В каждом конкретном случае я буду решать как удобне. У меня тоже есть проекты, которые содержат модули с интерфейсом использующим STL объекты. 
PM MAIL   Вверх
NiJazz
Дата 30.11.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



Цитата
неверно. У exe и dll одна куча

В данном случае, разная.
Не нужно пытаться исправлять ошибку просто обойдя проблему - выставить одинаковый рантайм. Просто не надо выпускать наружу контейнеры STL и всё тут. Используйте копирование, тогда и проблем не будет.

Добавлено через 3 минуты и 1 секунду
Об отладочной куче можно почитать здесь
PM MAIL   Вверх
mantissa
Дата 3.12.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.10.2007

Репутация: 1
Всего: 1



Привет Все!

Согласен с NiJazz по поводу того, что в 32 битной ОС кучи будут разные, но все равно не понимаю, в чем проблема освободить занимаемую память любой кучи, похоже что для безопасности процессов запрещают насильственными методами (ОС д.б. абсолютно все равно)

и второе... что плохого, что вектор находиться в одной куче и содержит объекты, хранящиеся в другой куче?


Цитата(Fazil6 @  30.11.2007,  18:45 Найти цитируемый пост)
... допустим, работу с БД, то функция чтения значения из BLOB записывала бы результат в некий буфер unsigned char* ...  


кто будет распределять память под буфер???
 с целью оптимизации было бы выгоднее, чтобы модуль сам распределял память (он то знает какого размера BLOB) (заодно бы и сообщения ползунку слала бы о ходе загрузки),  а программа бы в конце высвобождала по этому unsigned char* память. Но так не работает!

кстати отказаться от DLL начинает все больше привлекать меня smile (видно не дорос еще я до них)

с ув. BSD

PM MAIL   Вверх
mantissa
Дата 4.12.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.10.2007

Репутация: 1
Всего: 1



привет Всем!

более внимательное тестирование показало, что я был не прав, утверждая, что std::string работает без проблем по ссылке в DLL модуле.
НИЧЕГО не работает. Ни один объект динамически перераспределяющий память не будет корректно работать с другим потоком

учту ошибки в будущем. Всем СПАСИБО!

с ув. BSD
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0426 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.