C++ Visual Studio ресурсы

Я пытаюсь реализовать таблицу строк в файле ресурсов.rc, а затем загрузить определенную строку с помощью функции CString::LoadStringW(). Это код main.cpp:

#ifndef _AFXDLL
#define _AFXDLL
#endif
#include <afx.h>
#include <stdio.h>
#include "resource.h"

int main()
{
    printf("Code Example: Load resource file data\n");

    CString sentence;
    sentence.LoadStringW(IDS_STRING101);
    printf("Sentence: %s", sentence);

    getchar();
    return 0;
}

Уже есть хорошие ссылки с описанием, как использовать файлы ресурсов как:

http://www.cplusplus.com/forum/windows/119338/

http://www.winprog.org/tutorial/resources.html

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

Debug Assertion Failed!

Program: C:\WINDOWS\SYSTEM32\mfc140ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
Line: 24

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

В конце первого URL-адреса, который я указал, (в качестве последнего шага) есть ссылка на скомпилированный файл ресурсов.rc и мой исходный файл main.cpp. Я не уверен, как это сделать, и, возможно, именно поэтому моя программа не работает, как ожидалось.

Пожалуйста, есть ли у вас какие-либо рекомендации?

Я пытаюсь на MSVS 2015 / 2017.

Благодарю.

1 ответ

Решение

Через некоторое время я все еще не могу объяснить, почему код, размещенный в вопросе, не работает. Однако для чтения строкового ресурса из String Table я использовал другую функцию LoadString() и, наконец, заставил его работать, который на самом деле не является частью CString учебный класс.

Проблема с обработчиком ресурсов NULL решается путем получения дескриптора работающего файла.exe, который содержит эти ресурсы (хороший инструмент для проверки того, какие ресурсы включены, например, Resource Hacker) - сделано с GetModuleHandle(NULL)

Ниже приведен фрагмент рабочего кода.

main.cpp:

#include <afx.h>
#include <stdio.h>
#include "resource.h"
#define BUF_SIZE 50

int main(void)
{
    printf("Code Example: Load resource file data\n");

    wchar_t buffer[BUF_SIZE];

    if (!LoadString(GetModuleHandle(NULL), IDS_STRING104, buffer, BUF_SIZE))
    {
        printf("Error Loading String: IDS_STRING104\n");
    }
    else
    {
        printf("resource string: %ls\n", buffer);
    }

    getchar();
    return 0;
}

resource.h:

#define IDS_STRING103                   103
#define IDS_STRING104                   104

Resource.rc:

#include "resource.h"

STRINGTABLE
BEGIN
    IDS_STRING103           "Resource 103 sentence"
    IDS_STRING104           "Resource 104 sentence"
END

Вот несколько ссылок, которые были мне полезны:

Как получить дескриптор модуля моего собственного кода?

https://msdn.microsoft.com/en-gb/library/windows/desktop/ms647486.aspx

Другие вопросы по тегам