Главная страница
    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.46 MB
Время: 0.005 c
15-1244179520
DelphiN!
2009-06-05 09:25
2009.08.09
Какая какая из мышек произвела действие?


15-1244483958
User200902
2009-06-08 21:59
2009.08.09
Поиск лишних гиф и jpg


2-1244739123
User200902
2009-06-11 20:52
2009.08.09
Запуск проги и ожидание ее отработки


2-1244553876
ganzzz
2009-06-09 17:24
2009.08.09
Как из TList сделать TCollection


15-1244451289
Кто б сомневался
2009-06-08 12:54
2009.08.09
Посоветуйте компонент для локализации ПО, для D2009





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский