在 MFC 中将 HTML 资源转换为字符串
Converting HTML resource to string in MFC
我在 MFC 应用程序中将 HTML 资源转换为 CString 时遇到行话。任何帮助将不胜感激。我正在 VC++ 2022 上编译,显然是使用 unicode。
CString GetHTML(const int& RESOURCE_ID)
{
CString str;
HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(RESOURCE_ID), RT_HTML);
if (hrsrc != NULL)
{
HGLOBAL pResource = LoadResource(NULL, hrsrc);
if (pResource != NULL)
{
LPCTSTR lpctstr = static_cast<LPCTSTR>(LockResource(pResource));
if (lpctstr != NULL)
{
str = CString(lpctstr, ::SizeofResource(NULL, hrsrc));
return str;
}
UnlockResource(pResource);
}
FreeResource(pResource);
}
return NULL;
}
我的灵力表明你的 HTML 资源文件是 ascii,但你正在将 LockResource returned 的 ascii 字节转换为 unicode 字符串 LPCTSTR(指向 TCHAR 的指针)。
最简单的方法是将函数 return 设为 CStringA
而不是 CStringW
,然后对字符串进行 ascii 格式的所有处理。
将您的函数显式声明为 return 一个 CStringA
实例:
CStringA GetHTML(const int& RESOURCE_ID)
{
CStringA str;
然后,代替这个:
LPCTSTR lpctstr = static_cast<LPCTSTR>(LockResource(pResource));
if (lpctstr != NULL)
{
str = CString(lpctstr, ::SizeofResource(NULL, hrsrc));
return str;
}
这个:
const char* psz = static_cast<const char*>(LockResource(pResource));
if (psz != NULL)
{
str = CStringA(psz);
return str;
}
或者,如果您想从函数中 return 一个 unicode CString(W),您可以使用 MultiByteToWideChar
API 将资源转换为 unicode。 MFC/ATL 为此提供了一个方便的宏。
const char* psz = static_cast<const char*>(LockResource(pResource));
if (psz != NULL)
{
USES_CONVERSION;
CStringW strW = A2W(psz);
return strW;
}
另外,请注意我删除了所有 LPCTSTR 引用。我有 numerous rants about avoiding TCHAR macros.
我在 MFC 应用程序中将 HTML 资源转换为 CString 时遇到行话。任何帮助将不胜感激。我正在 VC++ 2022 上编译,显然是使用 unicode。
CString GetHTML(const int& RESOURCE_ID)
{
CString str;
HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(RESOURCE_ID), RT_HTML);
if (hrsrc != NULL)
{
HGLOBAL pResource = LoadResource(NULL, hrsrc);
if (pResource != NULL)
{
LPCTSTR lpctstr = static_cast<LPCTSTR>(LockResource(pResource));
if (lpctstr != NULL)
{
str = CString(lpctstr, ::SizeofResource(NULL, hrsrc));
return str;
}
UnlockResource(pResource);
}
FreeResource(pResource);
}
return NULL;
}
我的灵力表明你的 HTML 资源文件是 ascii,但你正在将 LockResource returned 的 ascii 字节转换为 unicode 字符串 LPCTSTR(指向 TCHAR 的指针)。
最简单的方法是将函数 return 设为 CStringA
而不是 CStringW
,然后对字符串进行 ascii 格式的所有处理。
将您的函数显式声明为 return 一个 CStringA
实例:
CStringA GetHTML(const int& RESOURCE_ID)
{
CStringA str;
然后,代替这个:
LPCTSTR lpctstr = static_cast<LPCTSTR>(LockResource(pResource));
if (lpctstr != NULL)
{
str = CString(lpctstr, ::SizeofResource(NULL, hrsrc));
return str;
}
这个:
const char* psz = static_cast<const char*>(LockResource(pResource));
if (psz != NULL)
{
str = CStringA(psz);
return str;
}
或者,如果您想从函数中 return 一个 unicode CString(W),您可以使用 MultiByteToWideChar
API 将资源转换为 unicode。 MFC/ATL 为此提供了一个方便的宏。
const char* psz = static_cast<const char*>(LockResource(pResource));
if (psz != NULL)
{
USES_CONVERSION;
CStringW strW = A2W(psz);
return strW;
}
另外,请注意我删除了所有 LPCTSTR 引用。我有 numerous rants about avoiding TCHAR macros.