win32 / C ++在资源中嵌入文本文件

问题描述 投票:-2回答:1

[我尝试在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

c++ winapi resources
1个回答
0
投票

感谢大家的评论和答复。

我在用我的代码玩得更多,还搜索了有关该错误的一些信息。显然,我的DATA.txt文件(ÿþ)中的前2个字节表示是UTF-16(big endian)编码类型,在note ++中打开,我看到的是UCS-2 LE BOM编码类型。最后,将DATA.txt文件更改为UTF-8编码(没有BOM),让我将该资源的内容分配给变量,并在代码中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.