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

时间:2010-01-03 10:40:06

标签: c++ windows resources

我正在开发一个win32应用程序。我目前正在使用以制表符分隔数据作为来源的文本文件。我想将此作为资源嵌入,以便我不必担心将此文件与.exe文件一起发送。

谁能告诉我怎么做?

5 个答案:

答案 0 :(得分:9)

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

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

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

#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;

    // NOTE: providing g_hInstance is important, NULL might not work
    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);
    /* you can now use the resource data */
}

答案 1 :(得分:5)

定义资源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...

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分: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