Иметь PCWSTR и нужно, чтобы он был WCHAR []

Я переписываю метод C ++ из загруженного мной кода. Первоначально метод принимал PCWSTR в качестве параметра, а затем предлагал пользователю ввести имя файла. Я изменил метод, чтобы принять два параметра (оба PCWSTR), а не предлагать пользователю. Я уже генерирую список файлов где-то еще. Я пытаюсь вызвать мой новый (модифицированный) метод с обоими параметрами из моего метода, который повторяет список файлов.

Исходный метод запрашивал ввод данных пользователем с помощью команды StringCBGetsW. Как это…

HRESULT     tst=S_OK;         //these are at the top of the method
WCHAR       fname[85] = {0};  //these are at the top of the method
tst = StringCbGetsW(fname,sizeof(fname));

Wchar Fname передается другому методу итерации ниже. Когда я смотрю на этот метод, он говорит, что это LPCWSTR тип; Я предполагаю, что это может занять WCHAR вместо.

Но то, что он не может сделать, это взять PCWSTR что метод получил. Моя конечная цель — попытаться не запрашивать у пользователя имя файла и вместо этого взять имя файла, которое было повторено ранее в другом методе.

ТЛ; др. У меня есть PCWSTR, и он должен быть преобразован в WCHAR. Я не знаю, что такое WCHAR [] или как с ним что-то сделать. В том числе попытаться сделать Printf чтобы увидеть, что это такое.

PS … Я знаю, что есть более простые способы перемещения и копирования файлов, поэтому я пытаюсь заставить эту работу работать с помощью программы.

0

Решение

Во-первых, давайте попробуем прояснить некоторые Специфичные для Windows типы.

WCHAR является typedef для wchar_t,
В Windows с Microsoft Visual C ++ это 16-битный тип символов (это можно использовать для строк Unicode UTF-16).

PCWSTR а также LPCWSTR два разных имени для одной и той же вещи: они в основном typedefс для const wchar_t*.

Начальный L в LPCWSTR это какой-то устаревший префикс, читайте со следующим P, обозначает «длинный указатель». Я никогда не программировал Windows в 16-битную эпоху (я начал с Windows 95 и Win32), но я понимаю, что в 16-битной Windows было что-то вроде рядом указатели а также дальние или длинные указатели. Теперь у нас есть только один тип указателей, поэтому L префикс может быть опущен.

P обозначает «указатель».
C обозначает «Константа».
W обозначает WCHAR/wchar_tи, наконец, что не менее важно, STR часть обозначает «Строка».

Итак, расшифровывая этот вид «венгерской нотации», PCWSTR средства const wchar_t*,
По сути, это указатель только для чтения NUL-завершённый wchar_t Unicode UTF-16 строка.

Достаточно ли этой информации для решения вашей проблемы?

Если у тебя есть wchar_t строковый буфер и функция, которая ожидает PCWSTRВы можете просто передать имя буфера (соответствующее адресу его первого символа) в функцию:

WCHAR buffer[100];
DoSomething(buffer, ...);  // DoSomething(PCWSTR ....)

Иногда — как правило, для выход строковые параметры — вы также можете указать размер (т. е. «емкость») целевого строкового буфера.
Если этот размер выражен с использованием количества символов (в данном случае в wchar_ts), обычная Win32 венгерская нотация cch («количество символов»); иначе, если вы хотите размер, выраженный в байтах, тогда обычный префикс cb («количество байтов»).
Итак, если у вас есть такая функция, как StringCchCopy()затем из Cch часть вы знаете размер выражается в символах (wchar_tс).

Обратите внимание, что вы можете использовать _countof() чтобы получить размер буфера в wchar_ts.
например в приведенном фрагменте кода, _countof(buffer) == 100, поскольку buffer сделано 100 wchar_ts; вместо, sizeof(buffer) == 200, так как каждый wchar_t имеет размер 2 байта == 16 бит, поэтому общий размер буфера в байтах равен 100 [wchar_t] * 2 [bytes/wchar_t] = 200 [bytes],

7

Другие решения


По вопросам рекламы [email protected]