Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

PChar результат функции из Dll


Страницы:   1 2

slavannnov ©   (2007-09-19 14:32:00) 

Из Dll библиотеки отдаю результат функции, как ссылку на запись, в которой содержится PChar.

Функция и типы примерно так:

PMyType = ^TMyType;
TMyType = record
 Pst: LongWord;
 Str: PChar;
 Bool: Boolean;
 Int: Integer;
end;

function GetResult(Data: ...): PMyType;
var
 Back: TMyType;
begin
 ...
 Back.Str := PChar('My string num = ' + IntToStr(10));
 ...
 Result := @Back;


Вызываю из приложения - получаю AV. Если убрать IntToStr и возвращать просто строку, то все ок. А в случае с IntToStr, Format - всегда AV. Что тут не так?


stanislav   (2007-09-19 15:12:00) [21]

Так тебе нужно и под Back.Str память выделять


Инс   (2007-09-19 14:57:00) [22]

Проще всего будет вместо String использовать WideString, но не правильнее всего...


slavannnov   (2007-09-19 14:52:00) [23]

Попробовал все способы исправить - не помогло. Стабильно с этими же симптомами получается AV. Что я ещё мог забыть?


stanislav   (2007-09-19 14:45:00) [24]

т.е. выделяешь и освобождаешь память в приложении, а не в dll.


stanislav   (2007-09-19 14:43:00) [25]

лучше передавать параметр, т.к. тебе ведь ее удалить нужно.


slavannnov   (2007-09-19 14:41:00) [26]

Ну хорошо, вроде понял про время жизни. Но как тогда получается, что используя просто строку - адрес памяти соответсвует уже не существующему адресу. Просто совпадаение, память не заняли под другие нужды?

Так как лучше делать: для результата New или передавать по ссылке вход. параметром?


Сергей М.   (2007-09-19 14:37:00) [27]


> Что тут не так?
>


Время жизни переменной Back равно времени работы ф-ции GetResult.

Поэтому в вызывающем коде ты получаешь адрес уже не существующей в памяти структуры TMyType


stanislav   (2007-09-19 14:35:00) [28]

Наверное нужно создавать указатель New(), и уничтожать Dispose().
Лучше сделай процедуру
procedure GetResult(Data: ...,Var MT:PMyType)


Ega23   (2007-09-19 14:34:00) [29]

var
 ss : string;

ss := 'My string num = ' + IntToStr(10);
Back.Str := PChar(ss);

?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо