Как открыть строку ресурса в Visual C ++ 2010? - PullRequest
4 голосов
/ 17 июля 2011

Я создал базовый строковый ресурс в Visual C ++. Я пытаюсь получить доступ к этому ресурсу. Тем не менее, моя программа не может найти ресурс. Здесь:

int main(int argc, char* argv[])
{
    HRSRC hRsrc;
    hRsrc = FindResource(NULL, MAKEINTRESOURCE(IDS_STRING102), RT_STRING);
    if (hRsrc == NULL) {
        printf("Not found\n");
    } else {
        printf("Found\n");
    }
}

Эта программа не может найти ресурс и всегда возвращает ноль.

Я создал простой растровый ресурс, и эта новая программа прекрасно его идентифицирует. Здесь:

int main(int argc, char* argv[])
{
    HRSRC hRsrc;
    hRsrc = FindResource(NULL, MAKEINTRESOURCE(IDB_BITMAP1), RT_BITMAP);
    if (hRsrc == NULL) {
        printf("Not found\n");
    } else {
        printf("Found\n");
    }
}

Это находит растровое изображение.

Строковые ресурсы обрабатываются как-то иначе?

Ответы [ 3 ]

6 голосов
/ 17 июля 2011

Если вы не хотите использовать LoadString (), это должно помочь ...

Строки и таблицы строк действительно обрабатываются по-разному при использовании FindResource () и FindResourceEx ().Начиная с этой статьи KB :

Строковые ресурсы хранятся в виде блоков строк.Каждый блок может иметь до шестнадцати строк и представляет наименьшую гранулярность строкового ресурса, который может быть загружен / обновлен.Каждый блок идентифицируется идентификатором (ID), начиная с единицы (1).Мы используем этот идентификатор при вызове функций FindResource, LoadResource и UpdateResource.

Строка с идентификатором nStringID находится в блоке с идентификатором nBlockID, заданным следующей формулой:

nBlockID= (nStringID / 16) + 1;// Обратите внимание на целочисленное деление.

Младшие 4 бита nStringID указывают, какая запись в блоке содержит фактическую строку.После того как вы вычислили идентификатор блока для передачи в FindResource () и индекс в блоке, в котором существует строка, вы должны просмотреть ее содержимое, чтобы найти искомую строку.

Следующий код должен получитьВы начали.

const WCHAR *stringPtr;
WCHAR stringLen;

//  Get the id of the string table block containing the target string
const DWORD blockID = (nID >> 4) + 1;

//  Get the offset of teh target string in the block
const DWORD itemID = nID % 0x10;

//  Find the resource
HRSRC hRes = FindResourceEx(
    hInst,
    RT_STRING,
    MAKEINTRESOURCE(blockID),
    wLanguage);
if (hRes)
{
    HGLOBAL hBlock = LoadResource(hInst, hRes);
    const WCHAR *tableDataBlock = reinterpret_cast<LPCWSTR>(LockResource(hBlock));
    const DWORD tableBlockSize = SizeofResource(hInst, hRes);
    DWORD searchOffset = 0;
    DWORD stringIndex = 0;

    //  Search through the section for the appropriate entry.
    //  The first two bytes of each entry is the length of the string
    //  followed by the Unicode string itself. All strings entries 
    //  are stored one after another with no padding.
    while(searchOffset < tableBlockSize)
    {
        if (stringIndex == itemID)
        {
            //  If the string has size. use it!
            if (tableDataBlock[searchOffset] != 0x0000)
            {
                stringPtr = &tableDataBlock[searchOffset + 1];
                stringLen = tableDataBlock[searchOffset];
            }
            //  Nothing there -
            else
            {
                stringPtr = NULL;
                stringLen = 0;
            }

            //  Done
            break;
        }

        //  Go to the next string in the table
        searchOffset += tableDataBlock[searchOffset] + 1;

        //  Bump the index
        stringIndex++;
    }
}
2 голосов
/ 17 июля 2011

Вы можете использовать LoadString напрямую вместо этого. Вот текст из документации MSDN FindResource ...

Приложение может использовать FindResource для поиска любого типа ресурса, но эту функцию следует использовать только в том случае, если приложение должно получить доступ к двоичным данным ресурса, выполнив последующие вызовы LoadResource и затем LockResource.

Для немедленного использования ресурса ...

... использовать LoadString!

0 голосов
/ 22 апреля 2014

После 2 дней исследований я нашел это (это работает!):

#include <atlstr.h>

......

ATL::CString str;
WORD LangID = MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT); 
str.LoadString(NULL,IDS_STRING101, LangID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...