任何人都可以提供解释或链接来解释 MFC 资源文件中的 STRINGTABLE 是如何定义的并且可以手动扩展吗?
我试图这样做,但在多项目解决方案中未能这样做。所述解决方案中的大多数项目都有自己的资源文件并重命名为 resource.h 文件。
当应用程序尝试访问字符串资源时,会显示错误消息“找不到 '22392' 的资源字符串”。22392 是我尝试创建的字符串的 ID。如果我改用已定义的字符串 ID,则不会收到类似的错误消息。
使用 Visual Studio 2010 的向导添加字符串资源也不起作用。但它正确显示在资源符号列表和字符串表编辑器中。
不用说,我没有参与过这个解决方案的创建。
谢谢你的帮助。
[编辑1]
我通过对使用的值执行“在文件中查找”并使用其他值排除了冲突的可能性:22390、22391、22393、22394、22395。总是得到相同的结果。
[编辑2]
我在一个新的、干净且简单的 MFC 应用程序中重复了我在复杂解决方案中所做的步骤,并且它没有问题地工作。因此,我认为我的问题与解决方案具有多个项目和资源的事实有关。
步骤如下:
- 在 resource.h 中选择一个免费号码(在我的例子中命名不同)并添加一个 #define IDS_XXX免费号码。
- 通过执行“在文件中查找”来验证所选数字。
在 resource.h 中的 STRINGTABLE 中添加一行,最好靠近 IDS_,其值接近我选择的值。
STRINGTABLE BEGIN IDS_OTHER "I have a number close to XXX" IDS_XXX "HelloHello" END
访问应用程序中的字符串:
CString strMyString; strMyString.LoadString(IDS_XXX); AfxMessageBox(strMyString, MB_YESNO | MB_ICONEXCLAMATION);
[编辑3]
我试图找到导致错误消息的 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 ) );
}
这很奇怪,因为可以很好地访问同一资源文件中的另一个字符串资源。