Macro MAKEINTRESOURCE chỉ thực hiện truyền giữa tham số số và con trỏ chuỗi. Con trỏ chuỗi kết quả là không hợp lệ và không thể được dereferenced như tên tài nguyên. Tuy nhiên, API xử lý tài nguyên phát hiện các con trỏ như vậy theo giá trị tuyệt đối của chúng và coi chúng là ID tài nguyên chứ không phải tên tài nguyên. Kể từ C-style API không hỗ trợ quá tải, họ không thể xác định hai chức năng như:
HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName);
HICON LoadIcon(HINSTANCE hInstance,UINT resourceId);
Vì vậy, các nhà phát triển API quyết định sử dụng các chức năng tương tự cho cả hai trường hợp, cung cấp MAKEINTRESOURCE vĩ mô cho người sử dụng API. Tôi tin rằng hai chức năng khác nhau có thể trông đẹp hơn:
HICON LoadIconByName(HINSTANCE hInstance,LPCTSTR lpIconName);
HICON LoadIconById(HINSTANCE hInstance,UINT resourceId);
Nhưng đây không phải là cách Windows API được triển khai. ID tài nguyên hợp lệ luôn nhỏ hơn giá trị con trỏ có thể tối thiểu. Tham số tên tài nguyên được chuyển tới API mà không có macro này và giá trị của nó không bị hạn chế.
Nguồn
2010-08-31 15:43:42
Các macro này luôn làm tôi bối rối. Tại sao họ không chỉ thực hiện hai chức năng riêng biệt, một trong đó có một số nguyên ID và một trong đó có một chuỗi ... – dreamlax
cảm ơn đây thực sự là những gì tôi đang tìm kiếm. –
@dreamlax: Không làm điều đó thực sự giải quyết một trong những vấn đề nó đã được tạo ra ở nơi đầu tiên;) Tất cả dữ liệu và chức năng trong một DLL được gán một thứ tự, và thứ tự có thể được sử dụng thay cho tên nếu bạn muốn. Điều này áp đặt một giới hạn về số lượng các phần tử có thể sử dụng trong một DLL đến 65K (do, trớ trêu thay, với sự tồn tại của macro này và cách nó tương tác với 'GetProcAddress'). Nếu bạn muốn duy trì khả năng tương thích ABI giữa các phiên bản DLL bằng cách có nhiều phiên bản của các hàm, mỗi phiên bản với các số thứ tự duy nhất, thì càng ít chức năng bạn có thể làm cho mọi thứ trở nên tốt hơn. –