![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PChar and DLL [D7, Win95/98, Win2k, WinXP]
Sun bittern © (2004-11-15 11:27:00)День добрый!
Чего-то я недопонимаю наверно. Но, вот функции из тестового юнита.
function AddSlashPath(const Dir: String): String;
begin
if Dir[Length(Dir)] <> '\' then
Result := Dir + '\'
else
Result := Dir;
end;
function DateTimeToFileName(const ADateTime: Double; const BasePath: PChar; ASection: TSection): PChar;
var
yy, mm, dd, th, tm, ts, tms: Word;
y, m, d, ff, S: String;
begin
DecodeDateTime(ADateTime, yy, mm, dd, th, tm, ts, tms);
y := IntToStr(yy);
m := IntToStr(mm);
d := IntToStr(dd);
ff := IntToStr(th);
if Length(m) = 1 then m := '0' + IntToStr(mm);
if Length(d) = 1 then d := '0' + IntToStr(dd);
if Length(ff) = 1 then ff := '0' + ff;
S := BasePath;
S := AddSlashPath(S);
case ASection of
sSopolimer: S := S + y + '\' + m + '\' + d + '\' + ff;
sSopolimerTRM138: S := S + y + 'a\' + m + 'a\' + d + 'a\' + ff + '.fbd';
sMonomer: S := S + y + 'm\' + m + 'm\' + d + 'm\' + ff + 'm';
end;
Result := PChar(S);
end;
Результат данной функции при вызове из тестого юнита выглядит так: 'C:\База\2004\11\15\08m'
Далее, данная функция была перемещена в DLL.
function DateTimeToFileName(const ADateTime: Double; const BasePath: PChar; ASection: TSection): PChar; stdcall;
Внутренности функции теже из тестового модуля.
В приложении, для вызова данной функции из DLL пишу:
const
LibSopMonDB = 'SopMonDB.DLL';
function DateTimeToFileName(const ADateTime: Double; const BasePath: PChar; ASection: TSection): PChar; stdcall;
...
implementation
function DateTimeToFileName(const ADateTime: Double; const BasePath: PChar; ASection: TSection)
: PChar; External LibSopMonDB name 'DateTimeToFileName';
Но результат вызова данной функции уже вглядит так: 'C:\База\2004\11\15\0'
Скушались 2 последних символа. Почему???
Толи лыжи не едут, толи я ...
Verg (2004-11-15 11:35:00) [1]
> var
> y, m, d, ff, S: String;
> begin
> ....................
> Result := PChar(S);
Тебе повезло, что всего два символа "скушались" :)
Ты же возвращаешь указатель на динамически выделяемую область памяти. Этой областью "рулит" локальная переменная (S). При выходе из процедуры все ее локальные переменные уничтожаются автоматически. В том числе и S и все, что с ней связано.
Так на что же будет указывать результат этой ф-ции?
Правильно, на мусор.
Часть строки все еще осталась "живой" чисто по стечению обстоятельств.