![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PChar результат функции из Dll
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);
?