Я переписываю метод 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 … Я знаю, что есть более простые способы перемещения и копирования файлов, поэтому я пытаюсь заставить эту работу работать с помощью программы.
Во-первых, давайте попробуем прояснить некоторые Специфичные для 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_t
s), обычная Win32 венгерская нотация cch
(«количество символов»); иначе, если вы хотите размер, выраженный в байтах, тогда обычный префикс cb
(«количество байтов»).
Итак, если у вас есть такая функция, как StringCchCopy()
затем из Cch
часть вы знаете размер выражается в символах (wchar_t
с).
Обратите внимание, что вы можете использовать _countof()
чтобы получить размер буфера в wchar_t
s.
например в приведенном фрагменте кода, _countof(buffer) == 100
, поскольку buffer
сделано 100 wchar_t
s; вместо, sizeof(buffer) == 200
, так как каждый wchar_t
имеет размер 2 байта == 16 бит, поэтому общий размер буфера в байтах равен 100 [wchar_t] * 2 [bytes/wchar_t] = 200 [bytes]
,