在 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.