![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какое практическое применение 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.
А что там дальше то в функции по тексту?