try it like this:

CopyMemory(pointer(cardinal(ValuePointer)+1), @s[1], Length(s));

I think that a normal string stores the length in the first byte. I'm not sure though