Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сбой после обращения к DLL, экспортная функция возвращает AnsiString 
V
    Опции темы
antur
Дата 14.11.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Такая проблема:

Вызывается функция из подключаемой DLL, она возвращает AnsiString. Так вот после возвращения программа аварийно завершается. В чем тут дело?! 
PM MAIL   Вверх
pandrew
Дата 14.11.2006, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(antur)
В чем тут дело?!  
1. ошибка в DLL 
2. ошибка при вызове

требуется детали: как описано в хедере, как вызываешь, где взял информацию (или это твои догадки)
PM MAIL   Вверх
Fazil6
Дата 14.11.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

//---------------------------------------------------------------------------
//   Important note about DLL memory management when your DLL uses the
//   static version of the RunTime Library:
//
//   If your DLL exports any functions that pass String objects (or structs/
//   classes containing nested Strings) as parameter or function results,
//   you will need to add the library MEMMGR.LIB to both the DLL project and
//   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
//   if any other projects which use the DLL will be performing new or delete
//   operations on any non-TObject-derived classes which are exported from the
//   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
//   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,
//   the file BORLNDMM.DLL should be deployed along with your DLL.
//
//   To avoid using BORLNDMM.DLL, pass string information using "char *" or
//   ShortString parameters.
//
//   If your DLL uses the dynamic version of the RTL, you do not need to
//   explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------


это сделано?
А вообще лучше не использовать в параметрах и результатах классы и структуры.
Возвращай лучше char*
PM MAIL   Вверх
pandrew
Дата 14.11.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Fazil6 @  14.11.2006,  17:04 Найти цитируемый пост)
А вообще лучше не использовать в параметрах и результатах классы и структуры.
Возвращай лучше char* 

Так тоже нехорошо: может быть утечка памяти.
В WinAPI обычно (но не всегда) передают буфер, его длину, а функция только заполняет.
PM MAIL   Вверх
Romikgy
Дата 14.11.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(pandrew @  14.11.2006,  16:20 Найти цитируемый пост)
Так тоже нехорошо: может быть утечка памяти.

тогда мож подойдет указатель на стринг передавать


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
antur
Дата 15.11.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Про нотацию насчет BORLNDMM.DLL я и забыл smile Теперь возвращаю char * и все OK. сПАСИБО!
Кстати, а тогда просто внутри DLL можно оперировать с AnsiString  или тоже не хорошо. Яимею ввиду внутри использовать AnsiString, ну а возвращать потом AnsiString.c_str()
PM MAIL   Вверх
Romikgy
Дата 15.11.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(antur @  15.11.2006,  09:35 Найти цитируемый пост)
 можно




--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fazil6
Дата 15.11.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Кстати, а тогда просто внутри DLL можно оперировать с AnsiString  или тоже не хорошо. Яимею ввиду внутри использовать AnsiString, ну а возвращать потом AnsiString.c_str()


так нельзя
Код

char * f()
{
   String s("bla-bla");
   return s.c_str();
}


так можно
Код

unsigned int f(char *buf, unsigned int buf_size)
{
     String s("bla-bla");
     strnspy(buf, s.c_str,buf_size - 1 );
     buf[buf_size - 1] = '\0';
     return s.Lengtn();
}



Это сообщение отредактировал(а) Fazil6 - 15.11.2006, 14:03
PM MAIL   Вверх
antur
Дата 15.11.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Тогда снова непонятно... я возвращаю s.c_str(). Заметил, что работает нестабильно (то есь иногда все ОК, а иногда возвращает мусор, хотя внутри dll перед выходом проверяю массив символов и все в поряде).
Вопросы насчсет второго варианта (что так можно): 
1. то есть я в кач-ве параметра передаю массив char *, куда и запишется результат.... но...
2. как я буду знать каким передавать параметр buf_size и что это за функция strnspy (не могу найти)?!
PM MAIL   Вверх
Fazil6
Дата 15.11.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Тогда снова непонятно... я возвращаю s.c_str(). Заметил, что работает нестабильно (то есь иногда все ОК, а иногда возвращает мусор, хотя внутри dll перед выходом проверяю массив символов и все в поряде).

 в том-то идело, что после выхода твой стринг удаляется, а ты используешь его буфер
Цитата

1. то есть я в кач-ве параметра передаю массив char *, куда и запишется результат.... но...
2. как я буду знать каким передавать параметр buf_size и что это за функция strnspy (не могу найти)?!

ну выделяй под buf память с запасом. Ты ведь примерно знаешь, что тебе вернуть должны и оценить можешь какая должна быть длина. С колько выделил, столько и указал размер в buf_size. Функция во втором варианте, например возвращает реальную длину, которую хотела вернуть и можешь проверить все ли влезло в буфер.


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


Новичок



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

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



Спасибо за ценные указания)) Все теперь работает!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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