Как строковый параметр может иметь тип byte * и тип wchar_t * одновременно?

В настоящее время я изучаю WinHttp API и наткнулся на функцию WinHttpConnect(), которая описана здесь. Описание параметра меня очень беспокоит. На вышеупомянутой странице сначала представлен прототип функции как

WINHTTPAPI HINTERNET WinHttpConnect(
  [in] HINTERNET     hSession,
  [in] LPCWSTR       pswzServerName,
  [in] INTERNET_PORT nServerPort,
  [in] DWORD         dwReserved
);

и продолжает описание параметра. Второй входной параметр объясняется следующим образом (без учета двух последних ненужных предложений):

[in] pswzServerName
Указатель на строку с нулевым завершением, содержащую имя хоста HTTP-сервера. Альтернативно строка может содержать IP-адрес сайта в ASCII, например, 10.0.1.45. [...]

Это та часть, с которой я борюсь. В C строка состоит либо из расширенных символов (как подразумевает тип параметра LPCWSTR), либо из байтов (как подразумевает формулировка «IP-адрес [...] в ASCII»). Мне неясно, как функция может отличить, являются ли байты в ячейке памяти, на которую указывает параметр, байтами, составляющими узкую строку, или широкими символами, составляющими широкую строку.

Может ли кто-нибудь пролить свет на это?

Это опечатка. Должно быть написано «...IP-адрес сайта в виде строки». Я исправлю документацию.

Raymond Chen 01.08.2024 17:03

Большое спасибо за быстрый ответ! Чтобы быть уверенным: это означает, что если у меня есть IP-адрес в виде массива unsigned char, я конвертирую его в массив wchar_t (например, используя mbstowcs()), а затем использую преобразованный массив wchar_t в качестве параметра?

Binarus 01.08.2024 17:32

@Бинарус - обычно LPCWSTR , лайк L"10.0.1.45"

RbMm 01.08.2024 17:55

@Binarus нет, вы не конвертируете необработанные байты IP как есть в широкие символы. Функция хочет получить строковое представление IP-адреса. Кроме того, «ASCII» не подразумевает строку byte*. Строка wchar_t* Unicode может содержать символы ASCII. Это просто символы, значения которых ниже 128.

Remy Lebeau 01.08.2024 18:01

Спасибо за комментарии и +1. Но у меня его еще нет: у меня есть IP-адрес в массиве unsigned char (это потому, что я нахожусь в DLL, которая экспортирует функции в другое приложение, и я получаю IP-адрес от другого приложения, а другое приложение предоставляет и нужны строки, закодированные как байтовые массивы с одним байтом на символ). С другой стороны, WinHttpConnect() ожидает, что второй параметр будет строкой, состоящей из wchar_t символов; то есть на каждый символ всегда приходится два байта, даже для символов ASCII. Следовательно, мне нужно это обращение, не так ли?

Binarus 01.08.2024 18:34

найдите RtlIpv4AddressToStringW для преобразования адреса в строку и RtlIpv6AddressToStringW для адреса ipv6. при необходимости можно использовать версию Ex с портом. можно использовать RtlIpv4StringToAddress[Ex]W для преобразования обратно строки в адрес

RbMm 01.08.2024 18:40

также вы можете использовать WSAAddressToString для более общего преобразования (любое sockaddr)

RbMm 01.08.2024 18:42

@RbMm Спасибо за советы! Однако упомянутые вами функции преобразуют числовые значения в строки и наоборот, в то время как мне нужно преобразовать строку, закодированную 1 байтом на символ, в строку, закодированную 2 байтами на символ. Первое — это то, что функции DLL получают от вызывающих их объектов (и должны возвращать им), второе — это то, что используют функции WinHttp.

Binarus 01.08.2024 18:55

Непонятно, в каком формате вы вводите. Это unsigned char addr[] = { 10, 0, 1, 45 }; или unsigned char addr[] = { '1', '0', '.', '0', '.', '1', '.', '4', '5', '\0' }?

Raymond Chen 01.08.2024 19:05

@Binarus, в чем проблема конвертировать Ansi в Unicode и обратно? MultiByteToWideChar и WideCharToMultiByte

RbMm 01.08.2024 19:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
14
57
1
Перейти к ответу Данный вопрос помечен как решенный

Другие вопросы по теме