Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > сбой после обращения к DLL


Автор: antur 14.11.2006, 16:42
Здравствуйте. Такая проблема:

Вызывается функция из подключаемой DLL, она возвращает AnsiString. Так вот после возвращения программа аварийно завершается. В чем тут дело?! 

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

требуется детали: как описано в хедере, как вызываешь, где взял информацию (или это твои догадки)

Автор: Fazil6 14.11.2006, 17:04
Цитата

//---------------------------------------------------------------------------
//   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*

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

Так тоже нехорошо: может быть утечка памяти.
В WinAPI обычно (но не всегда) передают буфер, его длину, а функция только заполняет.

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

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

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

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


Автор: Fazil6 15.11.2006, 13:52
Цитата

Кстати, а тогда просто внутри 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();
}


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

Автор: Fazil6 15.11.2006, 16:02
Цитата

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

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

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

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


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecrt/htm/_wcecrt_strncpy_wcsncpy.asp

Автор: antur 15.11.2006, 16:33
Спасибо за ценные указания)) Все теперь работает!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)