MAKEINTRESOURCE возвращает неверные указатели для идентификаторов ресурсов - PullRequest
1 голос
/ 21 марта 2012

У меня проблема с тем, что макрос MAKEINTRESOURCE всегда возвращает неверный указатель всякий раз, когда я передаю ему свои идентификаторы ресурса MFC. Все идентификаторы ресурсов перечислены в Resource.h и совпадают с идентификаторами, установленными в свойствах ресурса.

Я новичок в MFC, поэтому я не совсем уверен, что понимаю, как работают ресурсы и их ID, но мне кажется, что неверные указатели указывают на то, что мои ресурсы не хранятся в правильном месте в объем памяти? Это старый проект, к которому я пытаюсь добавить что-то новое, и я проверил anf, когда я пытаюсь сделать MAKEINTRESOURCE со старыми ресурсами (которые определенно работают, они появляются и работают, когда я запускаю приложение), я также получаю указатели.

Что может быть причиной этого?

edit: проект также использует набор символов Юникод, если это имеет какое-либо значение

1 Ответ

2 голосов
/ 21 марта 2012

Если под «плохими указателями» вы подразумеваете «указатели, которые не указывают на объекты ресурсов в памяти», то MAKEINTRESOURCE() работает правильно. Дело в том, что для того, чтобы передать либо строковые, либо целочисленные идентификаторы с использованием одного и того же параметра функции, функции Windows API выполняют странное преобразование указателя, которое определяется функцией как «о, подождите, это не указатель, а идентификатор ресурса». ».

Это документированное поведение. Например, в документации для LoadBitmap() написано:

lpBitmapName [in]:

Указатель на строку с нулевым символом в конце, которая содержит имя ресурса растрового изображения, который должен быть загружен. Кроме того, этот параметр может состоять из идентификатора ресурса в младшее слово и ноль в старшем слове. Макрос MAKEINTRESOURCE может быть использован создать это значение.

Создание недопустимого указателя путем повторной интерпретации произвольного целочисленного значения является допустимой конструкцией C ++, но разыменование недопустимого указателя является неопределенным поведением.

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

Примечание: Если это похоже на неприятный хак, то это потому, что - это неприятный хак.

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