Что означает MAKEINTRESOURCE ((id >> 4) +1)? - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь имитировать c поведение CString::LoadString(HINSTANCE hInst, DWORD id, WORD langID) без введения зависимости от MF C в мое приложение. Итак, я прошел через источник. Первое, что он делает, это немедленно вызывает AtlGetStringResourceImage(hInst, id, langID), а затем он, в свою очередь, содержит следующую строку кода:

    hResource = ::FindResourceExW(hInst, (LPWSTR)RT_STRING, MAKEINTRESOURCEW((id>>4)+1), langID);

(это не дословно, но я обрезал некоторые неважные вещи).

Что означает смещение идентификатора на 4 и добавление 1? Согласно документации FindResourceEx, вы должны передать MAKEINTRESOURCE(id), и я не могу найти пример кода, который манипулирует идентификатором, прежде чем передать его в MAKEINTRESOURCE. В то же время, если я вызову код MAKEINTRESOURCE(id), он не будет работать и FindResourceEx вернет ноль, тогда как если я использую вышеупомянутые shift + add, то он будет работать.

Может кто-нибудь объяснить это?

1 Ответ

1 голос
/ 25 марта 2020

Из документации STRINGTABLE :

R C выделяет 16 строк на раздел и использует значение идентификатора, чтобы определить, какой раздел должен содержать строку. Строки, идентификаторы которых отличаются только младшими 4 битами, помещаются в один и тот же раздел.

Код, который вас интересует, находит раздел, в котором хранится данный идентификатор строки, игнорируя младшие 4 бита.

...