如何使用设置为"char" "TCHAR maps to"使用TResourceStream?



我正在处理的项目需要资源管理,TCHAR maps to设置为char,为此我使用TResourceStream。以前,TCHAR maps to设置为wchar_t时,我没有遇到任何问题。我不会遇到编译器错误,但使用char映射,在尝试提取名为"r_1"(资源标识符(的资源时,我总是会遇到错误:

错误:找不到资源r_1

我已经阅读了文档:

https://docwiki.embarcadero.com/Libraries/en/System.Classes.TResourceStream.Create

https://docwiki.embarcadero.com/RADStudio/en/TCHAR_Mapping

我是不是犯了一个错误,或者可能无法从这个映射中使用它?

try
{
const System::UnicodeString r1 = L"r_1";
//int n1 = 1;
//System::NativeInt ni;
System::UnicodeString type ( L"RT_RCDATA" );
wchar_t *pType = type.c_str();
TResourceStream *pRStream = new TResourceStream((unsigned int)HInstance, r1, pType);
...
delete pRStream;
delete pType;
}
catch (const Exception &e)
{
...
ShowMessage(L"Error: " + e.Message);
return;                   
}

首先,不要使用delete pType;,因为pType没有指向用new分配的内存。您的UnicodeString type变量拥有内存,因此当它超出范围时,它将为您释放内存。

也就是说,TCHAR maps to设置对您显示的代码没有任何影响,因为TCHAR类型在该代码中的任何位置都没有使用。

但是,不应该将字符串值L"RT_RCDATA"用作TResourceString构造函数的最后一个参数。这不是RCDATA资源的正确资源类型。Win32 API将RT_RCDATA常量定义为MAKEINTRESOURCE(10)(它使用TCHAR,btw(,这意味着资源类型是数字10,而不是字符串"RC_DATA"。因此,您需要传入一个类型为System::Char*的整数10,例如:

TResourceStream *pRStream = new TResourceStream((unsigned int)HInstance, r1, reinterpret_cast<System::Char*>(10));

或者,您可以使用Win32 API的MAKEINTRESOURCEW()宏(MAKEINTRESOURCE()的Unicode版本(,它将把一个整数强制转换为wchar_t*(这是System::Char*在Windows上映射到的(:

TResourceStream *pRStream = new TResourceStream((unsigned int)HInstance, r1, MAKEINTRESOURCEW(10));

或者,您可以使用RT_RCDATA常量来提高可读性。为了避免TCHAR问题,RTL的System.Types单元(至少在现代C++Builder版本中(使用System::Char定义自己的RT_RCDATA常量,例如:

#include <System.Types.hpp>
TResourceStream *pRStream = new TResourceStream((unsigned int)HInstance, r1, System::Types::RT_RCDATA);

相关内容

最新更新