win32/C++ 在资源中嵌入文本文件
win32/C++ Embed a Text File in a Resource
我尝试在 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"。
manipulate/show data/buffer 内容的正确方法是什么??
更新中:
即使对数据使用另一种转换模式,丢弃'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)让我将此资源的内容分配给一个变量并在我的代码中使用它。
我尝试在 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"。
manipulate/show data/buffer 内容的正确方法是什么??
更新中: 即使对数据使用另一种转换模式,丢弃'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)让我将此资源的内容分配给一个变量并在我的代码中使用它。