VCL в C ++ Builder (и Delphi) 2007 использует Ansi, а не Unicode. TRegistry :: ReadString () внутренне вызывает функцию RegQueryValueExA () API Win32 вместо RegQueryValueExW (), а TRegistry :: ReadString () возвращает AnsiString, которая использует кодовую страницу Ansi по умолчанию для ОС. Любые данные Unicode автоматически конвертируются в Ansi операционной системой еще до того, как ваш код их увидит. '?' символ означает, что символ Unicode был преобразован в кодовую страницу Ansi, которая не поддерживает этот символ. Неважно, какой тип строки вы присваиваете результат ReadString (), данные Unicode уже потеряны до того, как ReadString () даже завершится.
Если вам нужно читать данные Unicode как Unicode, то вам нужно напрямую вызывать RegQueryValueExW () вместо использования TRegistry :: ReadString () (или обновления до C ++ Builder 2009 или более поздней версии, которая теперь использует Unicode).