gpt4 book ai didi

c++ - 读取嵌入式文本文件资源 Visual Studio C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:55 26 4
gpt4 key购买 nike

以下是我将文本文件添加为资源所采取的步骤:1.右击项目,添加New Item2.选择文本文件,点击添加3.进入项目属性,配置属性->Linker->Input->Embed Managed Resource File4. 然后我在那个文本框中添加了我的文本文件“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 is null,出于某种原因,FindResource 找不到 Items.txt,即使我使用上述步骤将其添加为资源,有人知道为什么 FindResource() 不起作用吗?顺便说一句,它编译没有错误,上面的代码是在一个应该返回包含“2000000”的文本行的方法中(我为了测试目的而改变了)

最佳答案

似乎在上面的 FindResource 函数中交换 MAKEINTRESOURCE(IDR_DATA1)MAKEINTRESOURCE(TEXTFILE) 的位置是可行的。

它在以下宽字符变体中的运行方式绕过上述步骤 1 - 4,并遵循@In Silico 的 solution。 :

  • 根据要求确保文本文件是 ANSI 或 Unicode(UTF-8 等需要额外转换)
  • 将文本文件复制到项目目录
  • 如前所述,在项目rc和resource.h中分别添加如下语句:

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

    对于 $(ProjectDir) 的某些子目录中的“Items.txt”,使用反斜杠转义反斜杠,完全限定的路径也可以,但可能不可移植。

    #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 查询的 widechar 实现。

关于c++ - 读取嵌入式文本文件资源 Visual Studio C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25255899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com