Макрос MAKEINTRESOURCE просто выполняет приведение между числовым параметром и указателем строки.Полученный указатель строки недействителен и не может быть разыменован как имя ресурса.Однако API обработки ресурсов обнаруживает такие указатели по их абсолютному значению и обрабатывает их как идентификатор ресурса, а не имя ресурса.Поскольку API в стиле C не поддерживает перегрузку, они не могут определять две функции, такие как:
HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName);
HICON LoadIcon(HINSTANCE hInstance,UINT resourceId);
Поэтому разработчики API решили использовать одну и ту же функцию для обоих случаев, предоставляя макрос MAKEINTRESOURCE для пользователей API.Я считаю, что две разные функции могут выглядеть лучше:
HICON LoadIconByName(HINSTANCE hInstance,LPCTSTR lpIconName);
HICON LoadIconById(HINSTANCE hInstance,UINT resourceId);
Но это не тот способ, которым реализован Windows API.Допустимый идентификатор ресурса всегда меньше минимально возможного значения указателя.Параметр имени ресурса передается в API без этого макроса, и его значение не ограничено.