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

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

Какое практическое применение UniqueString ? [D7, XP]


b/@. ©   (2009-06-15 15:23:00) 

Добрый день.
Рассматривая исходный текст функции function GetFileVersion(const AFileName: string): Cardinal;из SysUtilsобратил внимание на это:
 
 FileName := AFileName;
 UniqueString(FileName);

Но ни из хелпа ни из других примеров так и не понял зачем в этом месте применяется UniqueString. Тем более что её применение в самой VCL не встречается и без UniqueStringкод прекрасно работает.

Собственно вопрос:
С какой целью применятся UniqueStringв этом месте, и почему практически не применяется в других очень похожих участках ?


Sha   (2009-06-15 20:04:00) [1]

> Какое практическое применение UniqueString ?

например, цикл из [5] для строки с неизвестной уникальностью можно переписать так:

 p: pchar;

 UniqueString(s);
 integer(p):=integer(s);
 for i:=0 to Length(s)-1 do p[i]:='a';


Конечно, в данном случае строка и так уникальна из-за SetLength.


Palladin   (2009-06-15 16:19:00) [2]


> А если описать вот так function GetFileVersion("тут нету
> const" AFileName: string): Cardinal; - то как будет передаваться
> строка ?

Так же, по ссылке, но если произойдет ее изменение, то как раз вызовется LUniqueString, вставленный компилятором, вот только GetFileVersionInfo ничего не знает о строках Delphi потому последствия будут такие какие написал Sapersky


> Хороший аргумент. А я ниразу не пользовался UniqueString.
>  Для меня популярнее StrCopy :)

А я тоже ни разу не пользовался UniqueString, за полной не надобностью, потому она не более популярна нежели StrCopy


b/@.   (2009-06-15 16:14:00) [3]


> Palladin ©   (15.06.09 15:51) [3]
> Ты почему в этом так уверен то?

Потому что неоднократно проверял это на функции GetFileVersionInfo, тем более что в хелпе ничего нету по этому поводу.


> Более популярную? Я ей вообще ни разу не пользовался.

Хороший аргумент. А я ниразу не пользовался UniqueString. Для меня популярнее StrCopy:)


> > передавать параметр через стек
> При чем здесь стек и const ?

А если описать вот так function GetFileVersion( "тут нету const"AFileName: string): Cardinal;- то как будет передаваться строка ?


Sapersky   (2009-06-15 16:14:00) [4]

UniqueString создаёт отдельную копию строки в том случае, если её RefCount > 1, т.е. если на неё ссылаются 2 и больше переменных. Если этого не сделать - GetFileVersionInfo модифицирует не только FileName, но и все эти переменные.

UniqueString на самом деле применяется очень (ИМХО даже слишком) часто, но обычно она автоматически вставляется компилятором. Например:

Var s : String;
    n : Integer;
begin
SetLength(s, 10);
For n := 1 to Length(s) do
 s[n] := 'a'; // поставить здесь брейкпоинт и нажать Ctrl-Alt-C, когда до него дойдёт


Palladin   (2009-06-15 15:51:00) [5]


> ничего на самом деле не меняется.

Ты почему в этом так уверен то?


>  более популярную StrCopy

Более популярную? Я ей вообще ни разу не пользовался.


> передавать параметр через стек

При чем здесь стек и const ?


b/@.   (2009-06-15 15:48:00) [6]


function GetFileVersion(const AFileName: string): Cardinal;
var
 FileName: string;
 InfoSize, Wnd: DWORD;
 VerBuf: Pointer;
 FI: PVSFixedFileInfo;
 VerSize: DWORD;
begin
 Result := Cardinal(-1);
 // GetFileVersionInfo modifies the filename parameter data while parsing.
 // Copy the string const into a local variable to create a writeable copy.
 FileName := AFileName;
 UniqueString(FileName);
 InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
 if InfoSize <> 0 then
 begin
   GetMem(VerBuf, InfoSize);
   try
     if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then
       if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then
         Result:= FI.dwFileVersionMS;
   finally
     FreeMem(VerBuf);
   end;
 end;
end;


Вот только в отличии от этого замечания GetFileVersionInfo modifies the filename parameter data while parsingничего на самом деле не меняется.

Да и если менялось бы, то почему не использовать более популярную StrCopyили передавать параметр через стек а не как   const?


Palladin   (2009-06-15 15:40:00) [7]


> Но ни из хелпа ни из других примеров так и не понял зачем
> в этом месте применяется UniqueString.

А что там дальше то в функции по тексту?


Наверх

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