Если под «плохими указателями» вы подразумеваете «указатели, которые не указывают на объекты ресурсов в памяти», то MAKEINTRESOURCE()
работает правильно. Дело в том, что для того, чтобы передать либо строковые, либо целочисленные идентификаторы с использованием одного и того же параметра функции, функции Windows API выполняют странное преобразование указателя, которое определяется функцией как «о, подождите, это не указатель, а идентификатор ресурса». ».
Это документированное поведение. Например, в документации для LoadBitmap()
написано:
lpBitmapName [in]:
Указатель на строку с нулевым символом в конце, которая содержит имя ресурса растрового изображения, который должен быть
загружен. Кроме того, этот параметр может состоять из идентификатора ресурса в
младшее слово и ноль в старшем слове. Макрос MAKEINTRESOURCE может быть использован
создать это значение.
Создание недопустимого указателя путем повторной интерпретации произвольного целочисленного значения является допустимой конструкцией C ++, но разыменование недопустимого указателя является неопределенным поведением.
В этом случае функция, получающая аргумент, проверяет, является ли старшее слово 0, и если да, использует младшее слово в качестве целого числа и никогда не разыменовывает указатель.
Примечание: Если это похоже на неприятный хак, то это потому, что - это неприятный хак.