我正在处理的项目需要资源管理,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);