Я пытаюсь реализовать таблицу строк в файле ресурсов .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.
Благодарю.
Через некоторое время я все еще не могу объяснить, почему код, размещенный в вопросе, не работает. Однако для чтения строкового ресурса из 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
Других решений пока нет …