Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизPChar and DLL Найти похожие ветки
← →
Sun bittern © (2004-11-15 11:27) [0]День добрый!
Чего-то я недопонимаю наверно. Но, вот функции из тестового юнита.
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) [1]
> var
> y, m, d, ff, S: String;
> begin
> ....................
> Result := PChar(S);
Тебе повезло, что всего два символа "скушались" :)
Ты же возвращаешь указатель на динамически выделяемую область памяти. Этой областью "рулит" локальная переменная (S). При выходе из процедуры все ее локальные переменные уничтожаются автоматически. В том числе и S и все, что с ней связано.
Так на что же будет указывать результат этой ф-ции?
Правильно, на мусор.
Часть строки все еще осталась "живой" чисто по стечению обстоятельств.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.028 c