MFC - 手动扩展stringtable

时间:2012-03-09 10:01:59

标签: c++ mfc string-table

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

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

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

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

毋庸置疑,我没有参与创建此解决方案。

感谢您的帮助。

[EDIT1]

我通过对所使用的值执行'find in files'并使用其他值来排除冲突的可能性: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);
    
  5. [EDIT3]

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

    [EDIT4]

    我可以进一步隔离原因。

    在cstringt.h中,hInst为NULL,无法找到字符串ressource:

    _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 ) );
    }
    

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

2 个答案:

答案 0 :(得分:1)

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

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

如果字符串存在于字符串表中,并且仍然出现“未找到”错误,则会发生其他情况。

答案 1 :(得分:0)

ID的定义出现在Resource.h中。可能有人可能添加了一个字符串并删除了Resource.h中的条目,这就是为什么它会显示错误消息。打开resource.h并添加#define IDS_XXX 22392