Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с dll 
:(
    Опции темы
MSDN
Дата 4.4.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Проблема такая - как правильно вернуть из dll строку?
Просто пишу длл первый раз, а везде примеры по созданию очень тривиальные - типа вернуть сумму чисел или еще что нибудь в этом духе.
Вот поначалу возращал просто указатель на строку - char*. Вроде все работало, но через  10-15 таких вызовов длл вылетала. Потом я вроде че то нарыл из MSDN, что возращающая функция должна иметь тип - LPTSTR. Я поставил но она все равно вылетает. Вот потом я почитал пару статеек и из них узнал, что в отличии от Win16 в Win32 длл не размещаеться в памяти вызывающей ее программы. А я получаеться возращаю указатель на область памяти длл, может что то из за этого..... 
Вот ну вобщем оказываеться что можно строку или вобще любой массив или переменную записать в некой глобальной памяти - которая доступна как программе так и длл. Я записал и возращал на нее указатель - ну длл стала намного дольше держаться но все равно вылетает.
Может я что неправельно делал или еще что, но вобщем помогите пожайлуста.
PM MAIL   Вверх
dumb
Дата 4.4.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



PM MAIL   Вверх
MSDN
Дата 4.4.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

LPTSTR __declspec(dllexport) CALLBACK ToAsk(int ID,char *str) 
{
    int cout=FindPerson(ID),i,seek=0,len,k=0;
    if(cout<0) return "";
    ClearStr(str);
    LowCase(str);
    len=strlen(str);
    if((len<1)||(!strcmp(str,""))) return "";
    char *str1=new char[len];
    char *res=new char[1000];
    res[0]='\0';
    for(i=0;i<=len;i++)
    {
        str1[seek]=str[i];
        if((strcmp(str1,""))&&((str1[seek]=='?')||(str1[seek]=='\0')))
        {
            str1[seek+1]='\0';
            if(res[0]!='\0') strcat(res,". ");
            if(People[cout].FindInElem(str1)) strcat(res,"&repeat");
            else
            {
                People[cout].AddElem(str1);
                char *otv=People[cout].Ask(str1);
                strcat(res,otv);
                People[cout].shog+=SHOG;
                k++;
            }
            seek=-1;
        }
        seek++;
    }
    if(k) People[cout].shog/=k;
    return res;
}

Ну мой вопрос был - как правильно вернуть строку. Если в этом поможет мой код то пожайлуста... smile 
PM MAIL   Вверх
BorisVorontsov
Дата 4.4.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Ну и ник... это первое, что пришло в голову?

Цитата(MSDN @  4.4.2008,  12:08 Найти цитируемый пост)
Вот потом я почитал пару статеек и из них узнал, что в отличии от Win16 в Win32 длл не размещаеться в памяти вызывающей ее программы.


 smile 
Это либо полная чушь, либо ты неправильно понял текст. DLL размещается в АП использующей её программы.


Цитата(MSDN @  4.4.2008,  12:08 Найти цитируемый пост)
Вот ну вобщем оказываеться что можно строку или вобще любой массив или переменную записать в некой глобальной памяти - которая доступна как программе так и длл.


Это уже из другой оперы, расшаренные секции используют не для возврата строки из функции в пределах одной программы.


Цитата(MSDN @  4.4.2008,  12:08 Найти цитируемый пост)
но вобщем помогите пожайлуста


Возвращая указатель учитывай следующее:

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]
PM MAIL ICQ GTalk   Вверх
MSDN
Дата 4.4.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile скорее всего неправельно понял текст статьи. Но я ж говорю первый раз пишу длл.
По поводу ника - мой стабильный ник )))

Цитата

Так что вариан с char* lpStr = new char[size]; return lpStr; должен работать. Только надо не забывать удалять полученные данные посредством delete[].


тоесть получаеться так все верно, только нужно еще удалять полученые данные!?
PM MAIL   Вверх
BorisVorontsov
Дата 4.4.2008, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Цитата(MSDN @  4.4.2008,  12:33 Найти цитируемый пост)
тоесть получаеться так все верно, только нужно еще удалять полученые данные!?


В общем, да.


--------------------
[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]
PM MAIL ICQ GTalk   Вверх
MTWizard
Дата 5.4.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Желательно удалять данные также в DLL (сделать в ней экспортируемую функцию, принимающую указатель). Причина - при использовании бибилиотекой и EXE разных библиотек С времени выполнения - Runtime library (или разных куч, или переопределении new/delete, или ...) программа при удалении можут "упасть". Да и вообще, кто выделял, тот и освобождать должен  smile 

Это сообщение отредактировал(а) MTWizard - 5.4.2008, 23:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

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


 




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


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

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