我正在开发一个win32应用程序。我目前正在使用以制表符分隔数据作为来源的文本文件。我想将此作为资源嵌入,以便我不必担心将此文件与.exe文件一起发送。
谁能告诉我怎么做?
答案 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)
在项目的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