Я бы посоветовал вам использовать Unicode на протяжении всего пути.
LPCSTR - это "Длинный указатель на строку типа C" . Обычно это не то, что вы хотите, когда имеете дело с методами .Net. Тип char в .Net имеет ширину 16 бит.
Вам также не следует использовать макрос TEXT ("") , если вы не планируете несколько сборок с использованием различных кодировок символов. Попробуйте вместо этого обернуть все свои строковые литералы макросом _W ("") и создать чистую юникодовую сборку.
Посмотрите, поможет ли это.
PS. std :: wstring очень удобен в вашем сценарии.
EDIT
Вы видите только один символ, потому что строка теперь является Unicode, но вы приводите ее как обычную строку. Многие или большинство символов Unicode в диапазоне ASCII имеют те же номера, что и в ASCII, но вторые из их 2 байтов установлены в ноль. Поэтому, когда строка Юникода читается как C-строка, вы видите только первый символ, потому что C-строки заканчиваются нулем (нулем). легкий (и неправильный) способ справиться с этим - использовать std: wstring для приведения в качестве std: string, а затем извлечь C-String из этого. Это небезопасный подход, потому что Unicode имеет гораздо большее пространство символов, чем ваша стандартная кодировка.