LoadStringW - winuser.h. Что оно делает? - PullRequest
0 голосов
/ 30 октября 2009

Мне не удалось найти достойную документацию по этой функции. База кода, с которой я работаю, использует функцию из winuser.h с именем LoadStringW, которая принимает в качестве аргументов: (HINSTANCE hInstance, UINT uID, LPWSTR lpBuffer, int cchBufferMax).

Что это за функция? Для чего это? Когда он может вернуть 0?

Ответы [ 6 ]

6 голосов
/ 30 октября 2009

Стоит упомянуть, что почти все Win32 API, работающие со строками, имеют вариант «A» и «W».

Фактически вызываемый вариант определяется определением макросов, которые не заканчиваются на 'A' или 'W' - эти имена макросов - это то, что вы обычно воспринимаете как имя функции API (LoadString() в данном случае ). Сборки UNICODE будут использовать имена 'W', а сборки не-UNICODE будут использовать имена 'A'.

Бывают ситуации, когда вам может понадобиться вызвать версию API для Unicode, даже если сборка не является Unicode, и в этом случае вы просто используете имя напрямую, добавив в конец букву «W» (это реже необходимо вызывать не-Unicode API в сборке Unicode, но это так же возможно). Поскольку не-Unicode-версии Windows устарели, Microsoft все больше и больше начинает реализовывать только Unicode-версии API. Обратите внимание, что почти во всех случаях все, что делают версии API, отличные от Unicode, это преобразовывать строки ANSI / MBCS в Unicode, вызывать функцию 'W', а затем очищать.

3 голосов
/ 30 октября 2009

Вот документация для LoadString (): http://msdn.microsoft.com/en-us/library/ms647486%28VS.85%29.aspx

.. и вот документация, объясняющая различия между функциями ANSI и Unicode в Windows API: http://msdn.microsoft.com/en-us/library/cc500321.aspx.

По сути, функция LoadString поставляется в двух вариантах: ANSI и Unicode. LoadStringW - это версия LoadString для Unicode.

Редактировать: Просто чтобы прояснить, на самом деле нет двух совершенно отдельных функций. Версия ANSI действительно просто преобразует строку и вызывает версию Unicode, которая выполняет всю реальную работу.

2 голосов
/ 30 октября 2009

LoadStringW - версия Unicode для LoadString .

Документация гласит: «Если функция завершается успешно, возвращаемое значение - это количество TCHAR, скопированных в буфер, не включая завершающий символ NULL, или ноль, если строковый ресурс не существует. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError . "

0 голосов
/ 27 июля 2018

В сотый раз я только что подтвердил, что , когда компилятору ресурсов дано указание завершить строки нулем , число, возвращаемое LoadString , включает терминал NULL символ Я сделал это, изучив выходной буфер, который я сделал доступным для LoadString .

Строки ресурса не по умолчанию завершены нулем. В этом случае возвращаемый счетчик исключает нулевой символ терминала, как описано в документации, поскольку ноль добавляется функцией после того, как строка скопирована в выходной буфер.

Я подозреваю, что это связано с тем, что LoadString не учитывает тот факт, что компилятору ресурсов было дано указание завершить строки пустыми значениями. На самом деле, я подозреваю, что у них нет возможности узнать, что они были.

Что касается того, почему вы хотите завершить строки ресурсов нулем в первую очередь, когда они прекрасно работают без них, и ваш PE-файл, таким образом, немного меньше, причина в том, что реализация широких символов LoadString , в точке входа LoadStringW , возвращает указатель на строку, а не копирует ее в буфер, если переданный в нее адрес буфера является пустым указателем , Если ваши строки не заканчиваются нулем, использование LoadString таким способом приводит к весьма нежелательным результатам.

Поскольку строки ресурсов всегда хранятся в виде строк Unicode (широких символов), реализация LoadString в ANSI не может возвращать указатель, так как строка должна быть преобразована в ANSI; следовательно, его нельзя просто скопировать.

0 голосов
/ 30 октября 2009

Он загружает широкую строку из строкового ресурса, используя Windows Unicode Layer для Win95 и NT 3.51. Подробнее см. MSDN (см. Раздел «Примечания»).

0 голосов
/ 30 октября 2009

LoadStringW () - версия функции LoadString для WideCharacter.

См. MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...