c++ - 在 Visual Studio 中加载文本文件资源比它应该加载的更多

标签 c++ visual-studio-2013 resources

正如在其他各种帖子中看到的那样,我通过以下方式在 Visual Studio 2013 项目中添加了一些文本文件作为资源:右键单击该项目并选择添加 -> 资源后,我将以下行添加到生成文件resource.h:

#define MY_TEXTFILE 256
#define MY_CONFIG_FILE_RELEASE 4313
#define MY_CONFIG_FILE_DEV1 4314
#define MY_CONFIG_FILE_DEV2 4315

然后,我将以下行添加到 .rc 文件中:

MY_CONFIG_FILE_RELEASE MY_TEXTFILE "configFiles/releaseConfig.properties"
MY_CONFIG_FILE_DEV1 MY_TEXTFILE "configFiles/devConfig.properties"
MY_CONFIG_FILE_DEV2 MY_TEXTFILE "configFiles/dev2Config.properties"

这些文件的内容只是一行,例如对于 devConfig.properties 它将是

# DEV1 CONFIG

为了测试加载机制,我在 main

中直接使用了以下内容
int main(int argc, char *argv[]) {
  const char* data = NULL;
  loadTextFileResource(MY_CONFIG_FILE_DEV1, data);

  return 0;
}

loadTextFileResource 如下:

bool loadTextFileResource(int inName, const char*& outData) {
  HMODULE _handle;
  GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
    GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCTSTR)&someFunction, &_handle);
  if (_handle == NULL) return false;

  HRSRC _rc = FindResource(_handle, MAKEINTRESOURCE(inName), MAKEINTRESOURCE(MY_TEXTFILE));
  if (_rc == NULL) return false;

  HGLOBAL _rcData = LoadResource(_handle, _rc);
  if (_rcData == NULL) return false;

  LPVOID _rcDataLocked = LockResource(_rcData);
  if (_rcDataLocked == NULL) return false;

  DWORD _size = SizeofResource(_handle, _rc);
  if (_size == 0) return false;

  outData = static_cast<const char*>(_rcDataLocked);

  std::cout << "Loaded: " << outData << std::endl;

  return true;
}

这个小程序的输出是:

Loaded: # DEV1 CONFIG
P# DEV2 CONFIG

PADPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADD
INGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADD
INGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADD
INGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADD
INGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING

请注意,开头的两行不仅是 MY_CONFIG_FILE_DEV1 的内容,还有 MY_CONFIG_FILE_DEV2 的内容,尽管我只请求了前者。当我请求加载 MY_CONFIG_FILE_RELEASE 时也会发生同样的情况(即所有三个文件都加载到 outData 中)。因此,似乎所有“后续”资源都以某种方式与我请求的资源一起加载。这里到底发生了什么,为什么我的 loadTextFileResource 函数没有按照我的预期进行,即只加载我请求的资源的内容?

另外:“#DEV2 CONFIG”(相应文件的内容)前面的“P”在做什么?我应该以某种方式清理加载的数据吗?

请注意,如果项目被编译为 DLL,此加载机制也应该有效。

最佳答案

您通过将指向资源开头的指针分配给 const char * 来假设文本文件数据以零结尾:

outData = static_cast<const char*>(_rcDataLocked);

基本上,您根本不用size。您只需要构建字符串(std::stringstd::wstring 取决于原始文本文件使用的编码):

std::string result = { static_cast<const char *>(_rcDataLocked), size };

std::wstring result = { static_cast<const wchar_t *>(_rcDataLocked), size / sizeof(wchar_t) };

关于c++ - 在 Visual Studio 中加载文本文件资源比它应该加载的更多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35458854/

相关文章:

c++ - goto语句在C++中的用法

c++ - 将数据分配给 cv::Mat

c++ - 如何在 C++14 中编写通用转发 lambda?

visual-studio-2013 - 为 VS 2013 安装 SQL Server 2014 Data Tools BI

java - 使用 getResourceAsStream 从 JAR 或文件系统加载资源

c++ - 打印 boost 属性树生成的 xml

azure - 无法连接到 Windows Azure VM (Server 2012 R2) Web 部署服务

debugging - 如何检查 FAKE 脚本中的变量?

C#.Net 自动资源文件设计器代码生成

ASP.NET MVC - 非嵌入式资源文件