Главная страница
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.041 c
14-1100086499
Pentium133
2004-11-10 14:34
2004.11.28
Advanced Password Recovery


14-1100199269
Knight
2004-11-11 21:54
2004.11.28
Как можно вылечить системные файлы...


11-1082825813
Max003
2004-04-24 20:56
2004.11.28
Что делать? Минимальный MCK проект(пустая форма) весит 25.5 кб


3-1099118308
GURU-RU@bk.ru
2004-10-30 10:38
2004.11.28
Автосохранение БД


1-1100611573
Jk
2004-11-16 16:26
2004.11.28
Кодеры, хелп со строками!