Экспорт CString из dll
От: rikkitikkitavi Россия  
Дата: 26.06.03 13:06
Оценка:
Приветсвую всех!!!!!!!
нужна помощь вот в такой проблемке:

допустим, функцию вида

CString GetSomeString()
{
    CString str("bla bla bla");
    return str;
}

я запихнул в dll (линкуется динамически).

в основном коде примерно так


{
    ...
    CString s = GetSomeString();
}// вот тут-то в дуструкторе и падает


Падает при освобождении массива m_pchData — толи он уничтожен уже, толи не валиден.
Может, какой-то непорядок с подсчетом ссылок? Пытался вставлять всякие там Lock/UnlockBuffer(), ничего не выходит.
Или может как-то надо библиотеку поднастроить?
Re: Экспорт CString из dll
От: Bell Россия  
Дата: 26.06.03 13:21
Оценка:
Здравствуйте, rikkitikkitavi, Вы писали:

Проблема в том, что что память под твою строку выделяется в dll, а освобождается в основном приложении. Подробнее про это можно почитать у Рихтера, кое-что есть в этой статье
Автор(ы): Роман Хациев
Дата: 27.02.2002
Если вы пытались работать с экземплярами классов STL, передавая их в DLL, или получая оттуда, а потом бросили это занятие из-за непонятных ошибок, возникающих в вашей программе, то эта заметка для вас. Даже если видимых проблем в вашей программе нет, то все равно прочитайте эту заметку, чтобы знать что делать, когда они появятся :)


В качестве затычки попробуй выставь у обоих проектов одинаковые run-time library. Если используешь VC6, то это Project->settings->C/C++ ->code generation->use run-time library.
Любите книгу — источник знаний (с) М.Горький
Re: Экспорт CString из dll
От: Ахет  
Дата: 26.06.03 13:52
Оценка:
Здравствуйте, rikkitikkitavi, Вы писали:

не рекомендую вам делать экспорт классов вообще, пользуйтесь простыми указателями или хендлами при экспорте из динамических библиотек, либо как вариант статической линковкой кода.
Re: Экспорт CString из dll
От: nikita1  
Дата: 26.06.03 14:29
Оценка: -4
Здравствуйте, rikkitikkitavi, Вы писали:

R>нужна помощь вот в такой проблемке:

R>допустим, функцию вида
R>CString GetSomeString()
R>{
R> CString str("bla bla bla");
Ошибка в предыдущей строке. Вообще-то, надо
static CString str("bla bla bla");

R> return str;

Вы возвращаете адрес локальной переменной, которая лежит в стеке.
После завершения функции ее стек разрушается. И какой адрес Вы
хотите получить?

R>}

R>я запихнул в dll (линкуется динамически).
R>в основном коде примерно так
R>{
R> ...
R> CString s = GetSomeString();
R>}// вот тут-то в дуструкторе и падает
R>Падает при освобождении массива m_pchData — толи он уничтожен уже, толи не валиден.
R>Может, какой-то непорядок с подсчетом ссылок? Пытался вставлять всякие там Lock/UnlockBuffer(), ничего не выходит.
Желаю успеха,
Никита.
Re[2]: Экспорт CString из dll
От: Ахет  
Дата: 26.06.03 14:32
Оценка:
Здравствуйте, nikita1, Вы писали:

N>Вы возвращаете адрес локальной переменной, которая лежит в стеке.

N>После завершения функции ее стек разрушается. И какой адрес Вы
N>хотите получить?

повторное создание класса, это совершенно нормально, обратие внимание в коде возвращаеться живой обьект, а не ссылка.
CString GetSomeString();
CString& GetSomeString(); // было бы ошибкой
Re[2]: Экспорт CString из dll
От: Serguei666 Беларусь  
Дата: 26.06.03 17:24
Оценка:
Здравствуйте, nikita1, Вы писали:

N>Здравствуйте, rikkitikkitavi, Вы писали:


R>>нужна помощь вот в такой проблемке:

R>>допустим, функцию вида
R>>CString GetSomeString()
R>>{
R>> CString str("bla bla bla");
N>Ошибка в предыдущей строке. Вообще-то, надо
N>static CString str("bla bla bla");

R>> return str;

N>Вы возвращаете адрес локальной переменной, которая лежит в стеке.
Где вы видите возврат "адреса локальной переменной". Возвращается КОПИЯ локальной переменной.
Адрес — это если бы было так:
CString *GetSomeString()
{
CString str("bla bla bla");
return &str;
}
Вот такое, действительно, работать не будет
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[2]: Экспорт CString из dll
От: rikkitikkitavi Россия  
Дата: 27.06.03 13:58
Оценка:
Здравствуйте, Bell!

Огромное спасибо за инфу!
действительно помогло
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.