Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.022 c
1-1100151588
Margel
2004-11-11 08:39
2004.11.28
мастера! Нужна ф-я шифрования-дешифрования строки


3-1099332069
MMN
2004-11-01 21:01
2004.11.28
Инкрементирование поля


1-1100116011
Neiron
2004-11-10 22:46
2004.11.28
Пакер для Portable Executable на Delphi


14-1100172167
Ega23
2004-11-11 14:22
2004.11.28
Я вернулся.


14-1100278843
Barlog
2004-11-12 20:00
2004.11.28
Форум