书籍:《Visual C++ 2017从入门到精通》的2.7 字符串
环境:visual studio 2022
内容:LoadString()函数
问题:报未定义标识符 "IDS_FILENOTFOUND"错误
CString s;
s.LoadString(IDS_FILENOTFOUND);
在使用 CString::LoadString(IDS_FILENOTFOUND)
时出现 未定义标识符 "IDS_FILENOTFOUND"
错误,通常是因为以下原因之一。以下是逐步排查和解决方法:
1. 确认资源文件中已正确定义 IDS_FILENOTFOUND
-
检查
.rc
文件:
确保资源文件中存在IDS_FILENOTFOUND
的字符串定义(位于STRINGTABLE
中):STRINGTABLE BEGIN IDS_FILENOTFOUND "File not found" END
- 如果不存在,手动添加并保存文件。
-
检查
resource.h
文件:
确保resource.h
中包含对应的宏定义:#define IDS_FILENOTFOUND 103 // 数值可能不同,但需与 .rc 中一致
- 如果数值冲突,可以手动调整或让资源编辑器自动生成。
2. 确保代码包含正确的头文件
- 包含
resource.h
:
在调用IDS_FILENOTFOUND
的源文件顶部,必须包含资源头文件:#include "resource.h" // 确保路径正确
3. 验证资源类型和加载方式
-
资源类型必须是字符串:
IDS_FILENOTFOUND
必须定义为字符串资源(STRINGTABLE
),而非菜单、对话框或其他资源类型。 -
使用
AfxGetResourceHandle()
(可选):
如果资源位于动态链接库(DLL)中,需显式指定资源句柄:CString s; BOOL bLoaded = s.LoadString(AfxGetResourceHandle(), IDS_FILENOTFOUND);
4. 清理并重新生成项目
- 清理项目:
在 Visual Studio 中选择 生成 → 清理解决方案。 - 重新生成项目:
选择 生成 → 重新生成解决方案,确保资源文件被重新编译。
5. 检查资源 ID 的类型
- 确保
IDS_FILENOTFOUND
是UINT
类型:
LoadString
的参数应为UINT
类型的资源 ID。如果误定义为其他类型(如CString
),会导致编译错误。
6. 检查多模块项目中的资源链接
- 如果是多模块项目(如 EXE + DLL):
确保资源定义在正确的模块中,并且调用方模块正确链接了资源模块。
7. 示例代码验证
// 正确用法示例
CString s;
if (s.LoadString(IDS_FILENOTFOUND)) {
AfxMessageBox(s); // 显示 "File not found"
} else {
AfxMessageBox(_T("Failed to load string!"));
}
8. 其他可能性
- 资源文件未被添加到项目:
右键项目 → 添加 → 现有项,确保.rc
文件已包含。 - 资源编译器未启用:
在项目属性中检查 资源编译器 是否启用(默认应启用)。
通过以上步骤,应该能解决 IDS_FILENOTFOUND
未定义的问题。如果问题依旧,请检查:
- 资源 ID 是否被其他资源覆盖?
- 是否在正确的线程/模块上下文中加载资源?
- 是否使用了 Unicode/ANSI 字符集导致符号不匹配?