Понимание определения MAKEINTRESOURCEW - PullRequest
3 голосов
/ 03 июня 2010

Глядя на Windows SDK, я нашел эту директиву #define для MAKEINTRESOURCEW:

#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))

Может кто-нибудь объяснить мне, что, черт возьми, это значит? Например, каково будет значение MAKEINTRESOURCEW (0)? (1)? (-1)?

Ответы [ 4 ]

2 голосов
/ 03 июня 2010

Результатом этого макроса будет указатель на длинную строку со значением, равным данному параметру. Вы можете увидеть это, прочитав вывод прекомпилятора (см. Параметры компилятора / P C ++). Все преобразования требуются для компиляции этого результата макроса, когда требуется указатель LP [w] WSTR, как в конфигурации Win32, так и в конфигурации x64.

Некоторые Windows API, такие как LoadIcon, ожидают указатель строки в качестве своего параметра. Возможно, эти функции проверяют значение указателя, и если оно меньше некоторого максимума, они интерпретируют его как индекс ресурса, а не как строку (проблемы уродливого интерфейса в стиле C). Таким образом, этот макрос позволяет передавать WORD как строку, не изменяя ее значения, с соответствующим приведением.

2 голосов
/ 03 июня 2010

В большинстве случаев оно оставляет значение неизменным, но преобразует его из целого в указатель, чтобы оно было приемлемо для функций, ожидающих увидеть указатель. Промежуточные приведения расширяют ввод int до того же размера, что и указатель, при этом гарантируя против , что он расширяется на знак. В случае, если вам все равно, ULONG_PTR - это , а не , как вы можете догадаться, "ULONG POINTER" - скорее, это unsigned long такого же размера, как указатель. Еще до того, как 64-битное программирование стало проблемой, определение было что-то вроде:

#define MAKEINTRESOURCE(i)  (LPTSTR) ((DWORD) ((WORD) (i)))

В настоящее время они используют ULONG_PTR, который является 32-разрядным длинным без знака для 32-разрядной цели и 64-разрядным длинным без знака для 64-разрядной цели.

1 голос
/ 03 июня 2010

Как говорили другие пользователи - он просто переводит целое число в «указатель на строку».

Причина этого заключается в следующем: в древние времена в Windows 3.0 люди старались быть настолько минималистичныминасколько это возможно.Предполагалось, что ресурсы в исполняемом файле могут иметь строковый идентификатор или целое число.Следовательно, когда вы пытаетесь получить доступ к такому ресурсу - вы указываете один из вышеперечисленных, и функция автоматически определяет, что вы имели в виду (проверяя, выглядит ли предоставленный «указатель» как действительный указатель).

Поскольку функцияне удалось получить «переменный тип аргумента» - они решили сделать так, чтобы он получал LPCTSTR (или аналогичный), тогда как переданный параметр фактический может быть целым числом.

Другой пример из API Windows: Aуказатель на оконную процедуру.Каждое окно имеет оконную процедуру (доступ к которой осуществляется через GetWindowLong с флагом GWL_WNDPROC. Однако иногда это просто целое число, которое указывает, что это за "тип" окна. Тогда есть CallWindowProc, который знает, как различать эти случаи.

1 голос
/ 03 июня 2010

Это макрос, который приводит аргумент i к слову, затем приводит этот результат к указателю на длинную без знака, а затем снова к длинному указателю на строку широких символов.

...