Чтение встроенного текстового файла ресурса переполнения стека Visual Studio

Вот шаги, которые я предпринял, чтобы добавить текстовый файл в качестве ресурса:
1. Щелкните правой кнопкой мыши проект, добавьте новый элемент
2. Выберите текстовый файл, нажмите Добавить
3. Перейдите в свойства проекта, свойства конфигурации-> Linker-> Input-> Embed Managed Resource File.
4. Затем я добавил свой текстовый файл «items.txt в это текстовое поле

Затем в моем файле .rc я поместил следующий код:

#include "resource.h"IDR_DATA1 TEXTFILE "Items.txt"

В моем файле resource.h я поместил:

#define TEXTFILE   256
#define IDR_DATA1  255

В моем методе form1.cpp:

std::string result;
char* data = NULL;
HINSTANCE hInst = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDR_DATA1), MAKEINTRESOURCE(TEXTFILE));
if (NULL != hRes)
{
HGLOBAL hData = LoadResource(hInst, hRes);
if (hData)
{
DWORD dataSize = SizeofResource(hInst, hRes);
data = (char*)LockResource(hData);
}
else
{
MessageBox::Show("hData is null");
return "";
}
char* pkcSearchResult = strstr(data, "2000000");
if (pkcSearchResult != NULL)
MessageBox::Show(gcnew String(pkcSearchResult));
}
else
MessageBox::Show("hRes is null");
return result;

Я продолжаю получать hRes, равный нулю, независимо от того, что, по какой-то причине FindResource не находит Items.txt, даже если я добавил его как ресурс, используя шаги, описанные выше, кто-нибудь знает, почему FindResource () не работает? Кстати, он компилируется без ошибок, и приведенный выше код находится в методе, который должен вернуть строку текста, содержащую «2000000» (который я изменил для целей тестирования)

3

Решение

Похоже, что обмен местами MAKEINTRESOURCE(IDR_DATA1) а также MAKEINTRESOURCE(TEXTFILE) в выше FindResource функция будет работать.

То, как он работает в следующих широких вариациях символов, обходит шаги 1 — 4, как описано выше, и следует из @In Silico’s решение:

  • Убедитесь, что текстовый файл имеет формат ANSI или Unicode, в зависимости от требований (UTF-8, и т.д. требует дополнительной конвертации)
  • Скопируйте текстовый файл в каталог проекта
  • Как уже описано, добавьте следующие операторы в проект rc и resource.h соответственно:

    #include "resource.h"IDR_DATA1 TEXTFILE "Items.txt"

    Для «Items.txt» в некотором подкаталоге $ (ProjectDir) избежать обратной косой черты с помощью обратной косой черты, полный путь также работает, но не может быть переносимым.

    #define TEXTFILE   256
    #define IDR_DATA1  255
    

И определите две функции:

    void LoadFileInResource(int name, int type, DWORD& size, const wchar_t *& data) // *& is passing the pointer by reference and not by val.
{
HMODULE handle = ::GetModuleHandleW(NULL);
HRSRC rc = ::FindResourceW(handle, MAKEINTRESOURCEW(name), MAKEINTRESOURCEW(type));
HGLOBAL rcData = ::LoadResource(handle, rc);
size = ::SizeofResource(handle, rc);
data = static_cast<const wchar_t*>(::LockResource(rcData));
//LockResource does not actually lock memory; it is just used to obtain a pointer to the memory containing the resource data.
}

wchar_t GetResource()
{
DWORD size = 0;
const wchar_t* data = NULL;
LoadFileInResource(IDR_MYTEXTFILE, TEXTFILE, size, data);
/* Access bytes in data - here's a simple example involving text output*/
// The text stored in the resource might not be NULL terminated.
wchar_t* buffer = new wchar_t[size + 1];
::memcpy(buffer, data, size);
buffer[size] = 0; // NULL terminator
delete[] buffer;
return  *data;
}

data следует обеспечить широкую реализацию вышеизложенного pkcSearch запрос.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector