Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 и все, что с ней связано.
Так на что же будет указывать результат этой ф-ции?
Правильно, на мусор.
Часть строки все еще осталась "живой" чисто по стечению обстоятельств.


Наверх

Титульная страница Поиск, карта сайта Написать письмо