LoadString设置cchBufferMax为0无法返回只读指针问题求助
近期调用LoadString时遇到异常行为:按照文档说明,当将cchBufferMax设为0时,函数应返回资源字符串的长度,并将lpBuffer指向资源中字符串的只读指针;但实际调用返回-1,目标指针未被修改。不过传入非零大小缓冲区时,函数能正常加载字符串。
异常代码示例
LPCSTR lpAppName; LoadString(hInstance, IDS_APPNAME, reinterpret_cast<LPSTR>(&lpAppName), 0);
这段代码返回-1,lpAppName未被修改。
正常工作的代码示例
char cAppName[64]; LoadString(hInstance, IDS_APPNAME, cAppName, sizeof(cAppName));
两种场景使用的IDS_APPNAME一致(在resource.h中定义为200)。
解决思路
检查字符集匹配:
LoadString是宏,会根据项目字符集自动展开为LoadStringA(ANSI)或LoadStringW(Unicode)。如果资源字符串是Unicode编码,但代码中使用ANSI类型(LPCSTR),当传入cchBufferMax=0时,函数无法完成隐式转换,进而返回错误。可以显式调用对应版本测试:LPCWSTR lpAppName; int result = LoadStringW(hInstance, IDS_APPNAME, reinterpret_cast<LPWSTR>(&lpAppName), 0);若此调用正常,说明是字符集不匹配导致的问题,需统一代码与资源的字符集类型。
验证资源字符串属性:
打开资源编辑器,查看IDS_APPNAME对应的字符串资源,确认其字符集(ANSI/Unicode)是否与代码中使用的LoadString版本匹配。若项目默认字符集为Unicode,资源字符串会默认存储为Unicode,此时使用LoadStringA调用就会出现异常。确认hInstance有效性:
确保传入的hInstance是当前模块的有效实例句柄,避免混淆EXE与DLL的实例句柄。可临时替换为GetModuleHandle(NULL)(获取当前进程主模块句柄)进行测试,排除句柄无效的可能。检查资源ID与定义一致性:
打开.rc资源脚本文件,确认IDS_APPNAME对应的字符串条目ID确实为200,且没有其他资源占用该ID导致冲突。获取系统错误码定位问题:
在LoadString返回-1后,立即调用GetLastError()获取错误码:ERROR_RESOURCE_TYPE_NOT_FOUND(1813):资源类型不匹配,比如请求的字符串资源不存在或类型错误ERROR_RESOURCE_NAME_NOT_FOUND(1814):指定的资源ID不存在
内容的提问来源于stack exchange,提问作者Steven Stallion

