如何使用资源文件(txt-制表符分隔)作为Win32应用程序的数据源

3
我正在开发一个Win32应用程序。目前我正在使用包含制表符分隔数据的文本文件作为数据源。我希望将其嵌入资源中,这样我就不必担心将该文件与.exe文件一起发布了。
请问有人知道如何实现吗?

感谢大家发布相似的答案,我已经学会了。在这里添加一个通用的评论。 每个带有代码的答案都帮助我将其加载并作为char或string获取。但是我的文件是逐行包含数据的。如果所有内容都在一行中,那么就无法使用它。我想将其加载到映射数组中。 - coder
我想我明白了。我需要解析并查找 \t 和 \r 并正确读取字符。 - coder
5个回答

9

Windows二进制文件可以嵌入资源。 大多数资源是预定类型(例如菜单、图标或位图),但您也可以嵌入任意二进制数据(例如文本文件)。 从msdn文档中仅通过阅读很难确定正确的语法。

以下代码片段显示了如何从文件中嵌入二进制资源。

首先,您需要在头文件中定义一个资源标识符 (例如resource.h),该标识符将由C编译器和资源编译器使用:

#define MY_RESOURCE 300

然后,您需要添加到资源文件中 (例如resource.rc):

MY_RESOURCE RCDATA "file-with-data.txt"

最后,这是您可以访问此数据的方法:

void WorkOnResource(void)
{
    HGLOBAL     res_handle = NULL;
    HRSRC       res;
    char *      res_data;
    DWORD       res_size;
// 注意:提供g_hInstance很重要,NULL可能无法工作 res = FindResource(g_hInstance, MAKEINTRESOURCE(MY_RESOURCE), RT_RCDATA); if (!res) return; res_handle = LoadResource(NULL, res); if (!res_handle) return; res_data = (char*)LockResource(res_handle); res_size = SizeofResource(NULL, res); /* 您现在可以使用资源数据 */ }

3
"g_hInstance"在注释中提到,它是什么? - utvecklare

6

定义资源ID,将其添加到.rc文件中:

ID_CUSTOM1 ANYTHINGGOESHERE "filename.txt"

可以使用以下代码在运行时读取它:

  HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(ID_CUSTOM1), L"ANYTHINGGOESHERE");
  HGLOBAL hMem = LoadResource(hInst, hRes);
  DWORD size = SizeofResource(hInst, hRes);
  char* resText = (char*)LockResource(hMem);
  char* text = (char*)malloc(size + 1);
  memcpy(text, resText, size);
  text[size] = 0;
  FreeResource(hMem);
  // use text...

1
在Visual Studio中,您可以像添加其他资源一样添加文本资源。
在您的项目的resource.rc文件中:
IDR_MYRESOURCE  MYCUSTOMRESOURCETYPE "path_to_file.txt"

在 resource.h 文件中:
#define IDR_MYRESOURCE 104

(或者您可以通过资源编辑器添加这些,方法是选择“添加资源”,然后选择“新建”)

在代码中加载资源:

HRSRC hRes = FindResource( 0, "#104", "MYCUSTOMRESOURCETYPE" );
HGLOBAL hData = LoadResource( 0, hRes );
LPVOID data = LockResource( hData );

现在数据指向文本,可以转换为字符串。

编辑 嗯,看起来每个人都同时发布了相同的答案;P


1
为什么不使用头文件并将所有数据放入静态数组中。这样您就不必解析文本文件或担心部署的问题。

1
你说得没错,但是更新怎么办呢?这样做很困难。如果我想添加新的资源... 这样做很困难。 - coder

1
如果你正在寻找“正确”的方法来做这件事,我建议将你的文本文件作为资源添加(作为字符串表或二进制文件),然后使用LoadString或FindResource来访问它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接