Но мне почему-то видится так:
Код:
Temp := Pointer(Dest); // сохраняем Dest в Temp
if CharLength > 0 then // если требуемая длина ненулевая(мой вариант идём в begin end)
begin
Pointer(Dest) := _NewUnicodeString(CharLength); // создаём новую! строку
if Source <> nil then // если надо чем-то заполнить новую строку(мне не надо, след строку не выполняем)
Move(Source^, Pointer(Dest)^, CharLength * SizeOf(WideChar)); // заполняем строку содержимым. С моими параметрами вызова это не происходит, но и происходило бы - ради бога
end
else // сюда вообще не попадаем, у меня длина строки больше нуля, но всё же
Pointer(Dest) := nil; // раз строка пустая, то вот вам нильсен
_UStrClr(Temp); // нас это не колышет, результат-то у нас в Dest, тем не менее обнулили старую строку.
И вот почему же я должен предварительно обнулять
Dest, если его всё равно выкидывают на помойку и с нуля создают новую строку? И откуда в конце концов вылазит
Access Violation?
Если посмотреть ассемблерный код после
{$ELSE}, то там то же самое.
Всё!!! Всем спасибо, я допёр.
А "выполняет пункты 1)-5) из моего первого поста. На шаге 4) и происходит облом" - она не с результатом их выполняет и в самом конце, т.е. говорили мы в нужную сторону.
Резюме: SetString() выделяет под строку новую память, но про старую строку не забывает, уменьшает у ней refCnt. Так и должно быть.
На один вопрос я ответ не получил, но это чистое любопытство и крайне несущественно. Тема закрыта. Ещё раз пасибки!