此模块为本人独自写出来的。
在软件中有可能需要一大段超长文本,编译到软件中。
普通的文本字符串,可以直接用
C
char *s = "字符串...";
实现,如果字符串长一点,在C++的当前的版本中,可以用
C++
char *s =
"字符串...."
"字符串...."
...
"字符串...."
"字符串...."
这样的方式生成。
但如果字符串真的很长,如果都照上面的写法,会很累,维护也很麻烦,所以大部分人的做法,可能是会把它存为一个文本文件,在需要的时候再把它读出来。
但是,如果软件是像我的VxTerm一样,执着于单文件无依赖不需要安装,如果软件发布时还需要随着附带一个文本文件,就不是我所需要的了。
那么,有没有一种方法,是可以像普通文本文件一样写入编排好的格式文件,编译时可以把它也编译进程序里呢?
为此,试了很多方法,包括尝试使用 #include ...,好像还真有人尝试通过这种方式来实现,但实在是很麻烦,就放弃了这种方法,不知道 #include的方法是否有可以成功的。
接下来分享我自己创造出来的一种:使用资源文件来实现,功能可以说非常简单,也很容易实现,还非常好用。分享给所有的人!
最终实现的方式如下:
1、在资源文件中自定义一个“XML”的资源
2、双击打开指定资源时,实际上会打开一个绑定的 文本文件
3、直接编辑这个文本文件,完成后重新编译程序,就可以了:
实现步骤:
1、先在工程中添加一个 homepage.txt 文本文件:
然后在工程中直接编辑这个文件。
2、在资源视图中 添加资源
在添加资源界面中选择“导入”
选择后,输入一个自定义类型,确定。
就可以把资源与文本文件进行绑定。
2、再把添加进去的资源定义ID改为 IDR_Txt_HomePage
3、接下来就需要把这个资源读入字符串中:
(1)定义一个全局可以访问的函数:
C++
头文件定义:
string xPub_LoadstringFromXMLResource(long id_IDR, CString ResourceName = L"XML");
.cpp中函数实现:
string xPub_LoadstringFromXMLResource(long id_IDR, CString ResourceName)
{
HRSRC hRes;
hRes = FindResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(id_IDR), ResourceName);
if (!hRes)
return "";
HGLOBAL hResLoad = LoadResource(AfxGetInstanceHandle(), hRes);
LPVOID pRes = LockResource(hResLoad);
DWORD dwResSize = SizeofResource(NULL, hRes);
char* pp = (char*)hResLoad;
return string(pp, dwResSize);
}
由于是在C++中,并且我使用了string做为字符串承载体。如果不喜欢用这个string,可以考虑自己想办法把hResLoad实例化到内存中,并且中const char*对它做指向后返回该指针。
(2)使用时:
C++
string s = xPub_LoadstringFromXMLResource(IDR_Txt_HomePage);
变量s就是所需要的字符串了。