c++ - MFC - 手动扩展stringtable

标签 c++ mfc string-table

任何人都可以提供解释或链接来解释 MFC 资源文件中的 STRINGTABLE 是如何定义并可以手动扩展的吗?

我尝试这样做,但在多项目解决方案中未能这样做。所述解决方案中的大多数项目都有自己的资源文件并重命名为 resource.h-files。

当应用程序尝试访问字符串资源时,会显示错误消息“找不到‘22392’的资源字符串”。 22392 是我尝试创建的字符串的 ID。 如果我改用已定义的字符串 ID,则不会收到类似的错误消息。

使用 Visual Studio 2010 的向导添加字符串资源也不起作用。 但它在资源符号列表和字符串表编辑器中正确显示。

不用说我没有参与这个解决方案的创建。

感谢您的帮助。

[编辑1]

我通过对使用的值执行“在文件中查找”并使用其他值来排除冲突的可能性:22390、22391、22393、22394、22395。总是得到相同的结果。

[EDIT2]

我在一个新的、干净的、简单的 MFC 应用程序中重复了我在一个项目中执行的复杂解决方案中的步骤,并且它没有问题。因此,我认为我的问题与解决方案具有多个项目和资源这一事实有关。

步骤如下:

  1. 在 resource.h 中选择一个免费号码(在我的例子中命名不同)并添加一个#define IDS_XXX 免费号码
  2. 通过执行“在文件中查找”来验证所选号码。
  3. 向 resource.h 中的 STRINGTABLE 添加一行,最好靠近 IDS_,其值接近我选择的值。

    STRINGTABLE
    BEGIN
      IDS_OTHER          "I have a number close to XXX"
      IDS_XXX            "HelloHello"
    END
    
  4. 在应用程序中访问字符串:

    CString strMyString;
    strMyString.LoadString(IDS_XXX); 
    AfxMessageBox(strMyString, MB_YESNO | MB_ICONEXCLAMATION);
    

[EDIT3]

我试图找到导致错误消息的 LoadString 调用。 未能加载我的字符串资源的 LoadString 位于一个类中,该类与包含所述字符串资源的资源文件 (.rc) 位于同一项目中。在那里生成错误消息“找不到‘22392’的资源字符串”。这至少解释了为什么我用谷歌搜索找不到任何东西。

[编辑4]

我可以进一步找出原因。

在 cstringt.h 中,hInst 为 NULL,也就是找不到字符串资源:

_Check_return_ BOOL LoadString(_In_ UINT nID)
{
    HINSTANCE hInst = StringTraits::FindStringResourceInstance( nID );
    if( hInst == NULL )
    {
        return( FALSE ); // goes here, but shouldn't, hInst == NULL
    }
    return( LoadString( hInst, nID ) );
}

这很奇怪,因为可以在同一个资源文件中访问另一个字符串资源。

最佳答案

“未找到‘22392’的资源字符串”错误听起来像是 Windows 无法在字符串表中找到该特定字符串,尽管这与您的语句冲突“但它在资源符号列表和字符串表中正确显示编辑”。我会做或检查一些事情来缩小问题的范围:

  • 清理/重建整个项目和/或解决方案。我已经看到太多来自 VS 的奇怪行为只是由于错误或过时的构建,这通常是我尝试的第一件事。
  • 在文本编辑器中编辑 RC 文件:右键单击 RC 文件并在 VS2010 中单击“查看代码”。确认字符串 22392 实际存在且有效。还要检查它前后的条目。
  • 从字符串表和resource.h 中删除该字符串。从资源编辑器重新创建字符串。
  • 您提到“重命名的 resource.h 文件”。我不完全确定您的意思,但请确保在 RC 文件中正确使用它们:在文本编辑器中查看时,它们应该包含在顶部。
  • 确保 22392 的已定义名称未在项目的其他地方重新定义。

如果该字符串存在于字符串表中,但您仍然收到“未找到”错误,则说明发生了其他事情。

关于c++ - MFC - 手动扩展stringtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9632142/

相关文章:

c++ - 二叉树的列表实现是否可扩展?

c++ - 在 Visual C++ 6.0 MFC 中,是否可以将 CString 安全地视为简单类型而不是类?

elf - ELF 中的字符串表

c++ - VBA 调试器精度

c++ - ATL 中的 CImage 类

c++ - 我该如何更改MFC应用程序工具栏中的按钮的IMAGE(与类型无关)?

c - 在没有MFC的情况下使用MFC库

C++ Visual Studio 资源

c++ - 是否有适用于 C++ 的备忘单?