В настоящее время я изучаю 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-адрес в виде массива unsigned char
, я конвертирую его в массив wchar_t
(например, используя mbstowcs()
), а затем использую преобразованный массив wchar_t
в качестве параметра?
@Бинарус - обычно LPCWSTR
, лайк L"10.0.1.45"
@Binarus нет, вы не конвертируете необработанные байты IP как есть в широкие символы. Функция хочет получить строковое представление IP-адреса. Кроме того, «ASCII» не подразумевает строку byte*
. Строка wchar_t*
Unicode может содержать символы ASCII. Это просто символы, значения которых ниже 128.
Спасибо за комментарии и +1. Но у меня его еще нет: у меня есть IP-адрес в массиве unsigned char
(это потому, что я нахожусь в DLL, которая экспортирует функции в другое приложение, и я получаю IP-адрес от другого приложения, а другое приложение предоставляет и нужны строки, закодированные как байтовые массивы с одним байтом на символ). С другой стороны, WinHttpConnect()
ожидает, что второй параметр будет строкой, состоящей из wchar_t
символов; то есть на каждый символ всегда приходится два байта, даже для символов ASCII. Следовательно, мне нужно это обращение, не так ли?
найдите RtlIpv4AddressToStringW для преобразования адреса в строку и RtlIpv6AddressToStringW для адреса ipv6. при необходимости можно использовать версию Ex
с портом. можно использовать RtlIpv4StringToAddress[Ex]W
для преобразования обратно строки в адрес
также вы можете использовать WSAAddressToString
для более общего преобразования (любое sockaddr
)
@RbMm Спасибо за советы! Однако упомянутые вами функции преобразуют числовые значения в строки и наоборот, в то время как мне нужно преобразовать строку, закодированную 1 байтом на символ, в строку, закодированную 2 байтами на символ. Первое — это то, что функции DLL получают от вызывающих их объектов (и должны возвращать им), второе — это то, что используют функции WinHttp.
Непонятно, в каком формате вы вводите. Это unsigned char addr[] = { 10, 0, 1, 45 };
или unsigned char addr[] = { '1', '0', '.', '0', '.', '1', '.', '4', '5', '\0' }
?
@Binarus, в чем проблема конвертировать Ansi в Unicode и обратно? MultiByteToWideChar
и WideCharToMultiByte
Это опечатка. Должно быть написано «...IP-адрес сайта в виде строки». Я исправлю документацию.