TCHAR映射为char时如何正确使用TResourceStream加载资源?
问题根因
你代码里有3处明显错误,该问题和TResourceStream本身对TCHAR映射的支持无关:
- 错误1:手动释放UnicodeString内部缓冲区指针
你代码里的delete pType;属于严重错误,type.c_str()返回的指针由UnicodeString对象内部管理,生命周期随type对象自动释放,手动释放会直接导致堆内存损坏,引发不可预期的运行时错误。 - 错误2:资源类型传值错误
RT_RCDATA是Windows预定义的资源类型常量,本质是MAKEINTRESOURCE(10),不是普通字符串,你直接传字符串L"RT_RCDATA"会让系统去查找名字为"RT_RCDATA"的自定义资源类型,自然匹配不到你定义的RCDATA类型资源。 - 错误3:字符类型不匹配
当你把「TCHAR maps to」设置为char时,TResourceStream构造函数接收的资源名、类型参数是PChar也就是char*类型,你直接传wchar_t*会发生隐式类型转换,导致传入的字符串内容错乱,系统无法识别资源标识符。
修复后的代码
try { const char* r1 = "r_1"; // 预定义资源类型RT_RCDATA要用MAKEINTRESOURCE转换,不需要自定义字符串 const char* pType = MAKEINTRESOURCEA(RT_RCDATA); TResourceStream *pRStream = new TResourceStream((unsigned int)HInstance, r1, pType); // 资源处理逻辑 delete pRStream; // 不要手动释放pType,MAKEINTRESOURCE返回的是常量指针不需要释放 } catch (const Exception &e) { ShowMessage(L"Error: " + e.Message); return; }
额外说明
如果你的资源ID是数字ID而非字符串ID,直接把第二个参数换成MAKEINTRESOURCEA(你的数字ID)即可,不需要转字符串。
内容的提问来源于stack exchange,提问作者hexadecimal
相关产品推荐
相关产品推荐

