Windows编程:加载C盘管理员权限位图图像的问题求助
解决LoadImage()加载管理员权限BMP文件的错误问题
让我们一步步拆解你的问题,解决这两个不同参数下的错误情况:
一、错误码1814(ERROR_RESOURCE_NAME_NOT_FOUND)的原因
当你只传LR_SHARED作为最后一个参数时,LoadImage()的行为完全偏离了你的预期:
- 这个参数组合下,函数会把
L"C:\\test.bmp"当成资源名称(而非文件路径),去当前进程模块或者系统资源库中查找对应资源。显然不存在名为C:\test.bmp的资源,所以返回错误码1814。 LR_SHARED本身是用来共享系统资源或模块内资源的句柄,不能单独用来加载外部文件。
二、LR_LOADFROMFILE时GetLastError返回0的说明
首先要明确一个关键规则:只有当LoadImage()返回NULL时,调用GetLastError()才有意义。如果函数成功返回了有效的HBITMAP句柄,此时GetLastError()的返回值是随机的(通常是0),不能用它判断加载是否失败。
你遇到的情况大概率是两种可能:
- 函数其实已经成功加载了位图,但你没检查
hBitmap的返回值,误以为0是错误; - 函数返回了
NULL但GetLastError()返回0,这通常和文件权限有关——因为你的BMP文件所有者是管理员,当前程序如果以普通用户权限运行,可能没有读取该文件的权限。
三、正确的解决方案
1. 修正参数组合
加载外部BMP文件,必须指定LR_LOADFROMFILE,这是告诉函数“我要加载的是磁盘文件,不是资源”。如果需要系统共享位图句柄(无需手动调用DeleteObject()释放),可以搭配LR_SHARED,否则可以省略。
修正后的代码示例:
// 加载外部BMP的正确参数组合 HBITMAP hBitmap = (HBITMAP)LoadImage( NULL, L"C:\\test.bmp", IMAGE_BITMAP, LR_DEFAULTSIZE, LR_DEFAULTSIZE, LR_LOADFROMFILE | LR_SHARED // 按需去掉LR_SHARED ); // 必须检查返回值判断是否成功 if (hBitmap == NULL) { DWORD lastError = GetLastError(); // 这里处理错误,比如打印错误码或提示用户 } else { // 加载成功,正常使用位图 // 如果没加LR_SHARED,用完后要调用DeleteObject(hBitmap)释放内存 }
2. 解决权限问题
如果修正参数后仍然返回NULL,大概率是权限不足:
- 右键你的程序,选择以管理员身份运行,再尝试加载;
- 或者修改
C:\test.bmp的文件权限:右键文件→属性→安全→编辑,给当前登录用户添加读取权限。
关键注意点
- 永远不要用
GetLastError()判断函数是否成功,必须先检查LoadImage()的返回值是否为NULL; LR_SHARED会让系统管理位图内存,但如果需要修改位图像素数据,不要使用这个参数;- C盘根目录属于系统保护目录,普通程序写入/读取可能受UAC限制,建议把测试文件放到非系统盘(比如D盘)或者用户目录下,避免权限问题。
内容的提问来源于stack exchange,提问作者monalisha saha
相关产品推荐
相关产品推荐

