You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:24:04