![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
MSDN |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 31.1.2008 Репутация: нет Всего: нет |
Здравствуйте!
Проблема такая - как правильно вернуть из dll строку? Просто пишу длл первый раз, а везде примеры по созданию очень тривиальные - типа вернуть сумму чисел или еще что нибудь в этом духе. Вот поначалу возращал просто указатель на строку - char*. Вроде все работало, но через 10-15 таких вызовов длл вылетала. Потом я вроде че то нарыл из MSDN, что возращающая функция должна иметь тип - LPTSTR. Я поставил но она все равно вылетает. Вот потом я почитал пару статеек и из них узнал, что в отличии от Win16 в Win32 длл не размещаеться в памяти вызывающей ее программы. А я получаеться возращаю указатель на область памяти длл, может что то из за этого..... Вот ну вобщем оказываеться что можно строку или вобще любой массив или переменную записать в некой глобальной памяти - которая доступна как программе так и длл. Я записал и возращал на нее указатель - ну длл стала намного дольше держаться но все равно вылетает. Может я что неправельно делал или еще что, но вобщем помогите пожайлуста. |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
||||
|
||||
MSDN |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 31.1.2008 Репутация: нет Всего: нет |
Ну мой вопрос был - как правильно вернуть строку. Если в этом поможет мой код то пожайлуста... ![]() |
|||
|
||||
BorisVorontsov |
|
||||
![]() Thinker ![]() ![]() Профиль Группа: Комодератор Сообщений: 714 Регистрация: 3.11.2005 Где: Молдавия, г. Киши нёв Репутация: 4 Всего: 10 |
Ну и ник... это первое, что пришло в голову?
![]() Это либо полная чушь, либо ты неправильно понял текст. DLL размещается в АП использующей её программы.
Это уже из другой оперы, расшаренные секции используют не для возврата строки из функции в пределах одной программы. Возвращая указатель учитывай следующее: 1. new (malloc, LocalAlloc, HeapAlloc) выделяют память в куче, и указатель будет валиден после выхода из функции 2. _alloca выделяет память в стеке вызвавшей её функции, и указатель будет валиден только в пределах данной функции 3. статические строки имеют фиксированный указатель и доступны в пределах всей программы Так что вариан с char* lpStr = new char[size]; return lpStr; должен работать. Только надо не забывать удалять полученные данные посредством delete[]. -------------------- [code=cpp] const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out); for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl; [/code] |
||||
|
|||||
MSDN |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 31.1.2008 Репутация: нет Всего: нет |
![]() По поводу ника - мой стабильный ник )))
тоесть получаеться так все верно, только нужно еще удалять полученые данные!? |
|||
|
||||
BorisVorontsov |
|
|||
![]() Thinker ![]() ![]() Профиль Группа: Комодератор Сообщений: 714 Регистрация: 3.11.2005 Где: Молдавия, г. Киши нёв Репутация: 4 Всего: 10 |
В общем, да. -------------------- [code=cpp] const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out); for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl; [/code] |
|||
|
||||
MTWizard |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 8.10.2007 Где: Київ Репутация: нет Всего: 4 |
Желательно удалять данные также в DLL (сделать в ней экспортируемую функцию, принимающую указатель). Причина - при использовании бибилиотекой и EXE разных библиотек С времени выполнения - Runtime library (или разных куч, или переопределении new/delete, или ...) программа при удалении можут "упасть". Да и вообще, кто выделял, тот и освобождать должен
![]() Это сообщение отредактировал(а) MTWizard - 5.4.2008, 23:33 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |