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

Вниз

Какое практическое применение UniqueString ?   Найти похожие ветки 

 
b/@. ©   (2009-06-15 15:23) [0]

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

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

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


 
Palladin ©   (2009-06-15 15:40) [1]


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

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


 
b/@. ©   (2009-06-15 15:48) [2]


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:51) [3]


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

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


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

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


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

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


 
b/@. ©   (2009-06-15 16:14) [4]


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

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


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

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


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

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


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

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 16:19) [6]


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

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


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

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


 
Sha ©   (2009-06-15 20:04) [7]

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

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

 p: pchar;

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


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



Страницы: 1 вся ветка

Текущий архив: 2009.08.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
15-1244549105
oldman
2009-06-09 16:05
2009.08.09
Все на свете можно заменить кусочком пластилина...


4-1213868141
Nil
2008-06-19 13:35
2009.08.09
Поясните пожалуйста работу WM_EXITSIZEMOVE


6-1205160643
alexm_hs
2008-03-10 17:50
2009.08.09
Как работать с MIB-файлами?


15-1243715424
Юрий
2009-05-31 00:30
2009.08.09
С днем рождения ! 31 мая 2009 воскресенье


3-1225445959
dmitry_12_08_73
2008-10-31 12:39
2009.08.09
Сохранение курсоров в TDBGrid