[我尝试在win10 x64计算机上使用代码块(TDM-GCC编译器)在win32 exe文件中嵌入自定义TXT文件。
使用由In silico回答的方法,在类似的问题中,“ buffer”变量仅显示前3个字节。例如:Data.txt文件包含:“ HOLA MUNDO”(在十六进制编辑器中检查了22个字节)
但是当我使用MessageBox()显示'char * buffer'变量时,它仅显示DATA.txt的前三个字节:ÿþH
这是我的代码:
void LoadFileResource() {
char* data = NULL;
DWORD rcSize = 0;
TCHAR sResName[5] = _T("#107"); // ID from resource.h file for DATA.txt
TCHAR sRestype[8] = _T("DATAREG"); // custom typeID from .rc file for DATA.txt
HRSRC rc = ::FindResource(NULL, sResName, sRestype);
HGLOBAL rcData = ::LoadResource(NULL, rc);
rcSize = ::SizeofResource(NULL, rc); // Have value of 22, and DATA.txt have 22 bytes
data = static_cast<const char*>(::LockResource(rcData));
char* buffer = new char[rcSize+1];
::memcpy(buffer, data, rcSize);
buffer[rcSize+1] = 0; // NULL terminator, I think here is 0 for very LAST position of buffer
MessageBox(NULL, buffer, NULL, MB_OK); // Only show 3 first bytes from DATA.txt
delete[] buffer;
}
还检查了在最终EXE文件中编译的资源,并且DATA.txt的内容在此处为“ HOLA MUNDO”。
什么是操作/显示数据/缓冲区内容的正确方法?
正在更新:即使对数据使用另一种转换模式,也要丢弃'new char []'和'memcpy()':
data = (char*)(::LockResource(rcData));
LPBYTE sData = (LPBYTE)data;
LPTSTR sXml = (LPTSTR)sData;
DWORD buffSize = strlen(sXml); // Result in 3, don't know why.
MessageBox(NULL, sXml, NULL, MB_OK); //Shows again only first 3 bytes of DATA.txt
相同结果ÿþH。
感谢大家的评论和答复。
我在用我的代码玩得更多,还搜索了有关该错误的一些信息。显然,我的DATA.txt文件(ÿþ)中的前2个字节表示是UTF-16(big endian)编码类型,在note ++中打开,我看到的是UCS-2 LE BOM编码类型。最后,将DATA.txt文件更改为UTF-8编码(没有BOM),让我将该资源的内容分配给变量,并在代码中使用它。