Почему LoadResource / LockResource иногда возвращает объединенные данные ресурса? - PullRequest
3 голосов
/ 31 июля 2010

Я работаю с проектом Visual Studio C ++, который содержит ряд ресурсов HTML. Они загружаются методом, который выглядит следующим образом:

LPCTSTR loadHTML(HMODULE hModule, LPCTSTR sResourceName)
{
    HRSRC hResource = FindResource(hModule, sResourceName, RT_HTML);
    if(!hResource)
        return 0;

    HGLOBAL hResourceData = LoadResource(hModule, hResource);
    if(!hResourceData)
        return 0;

    return reinterpret_cast<LPCTSTR>(LockResource(hResourceData));
}

В большинстве случаев это работает нормально. Однако иногда он возвращает ресурс, связанный с другим ресурсом. Когда это происходит, это постоянная проблема в этой сборке. Я могу «исправить» это, добавив несколько пустых строк к рассматриваемому ресурсу и затем перестроив проект. Это происходит периодически, даже когда ресурсы не изменились.

Я очень хочу понять, почему это происходит. Кто-нибудь еще сталкивался с этим? Может ли быть что-то особенное в моих ресурсах, которое вызывает проблему? Мой код неверен?

К сожалению, я не хочу размещать пример ресурса здесь; они довольно длинные, и это проприетарное программное обеспечение.

Ответы [ 2 ]

6 голосов
/ 31 июля 2010

Что характерно в ваших ресурсах, так это то, что вы ожидаете, что они обнуляются. Разделы ресурса iirc выровнены по 16-байтовым границам, что означает, что всякий раз, когда «большой двоичный объект» кратен 16 байтам, между ресурсом и следующим не будет никакого разделяющего байта.

Либо убедитесь, что ресурсы сохранены с завершающим нулевым символом, либо используйте SizeofResource , чтобы определить, где заканчивается ресурс.

3 голосов
/ 31 июля 2010

Как вы определяете конец ресурса?Ваши файлы ресурсов заканчиваются (дважды для Unicode) NULL?Я не думаю, что есть какая-либо гарантия того, что ресурс в файле PE завершен с нулевым значением, и вы, похоже, рассматриваете его как строку.

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