注册表 RegQueryValueExW
Registry RegQueryValueExW
在这种情况下,是否可以不将注册表中的值读取到字符数组而是直接读取到 AnsiString?
LONG result;
wchar_t buf[255] = {0};
DWORD dwBufSize = sizeof(buf);
String d = "Nazwa";
DWORD dwType = REG_SZ;
result = ::RegQueryValueExW( hkSoftware, (LPCWSTR)(d.c_str()), NULL, &dwType, (LPBYTE)&buf, &dwBufSize );
首先,您的代码示例未使用 AnsiString
。在 C++Builder 2009 及更高版本中,String
是 UnicodeString
的别名。
是的,您可以将 UnicodeString
与 RegQueryValueExW()
一起使用,而无需使用类型转换。 UnicodeString::c_str()
returns 一个 WideChar*
,而 WideChar
是 Windows 上 wchar_t
的别名,所以 WideChar*
(又名 wchar_t *
) 可隐式转换为 LPCWSTR
(又名 const wchar_t *
),例如:
LONG result;
wchar_t buf[255] = {0};
DWORD dwBufSize = sizeof(buf);
UnicodeString d = L"Nazwa";
DWORD dwType = REG_SZ;
result = ::RegQueryValueExW( hkSoftware, d.c_str(), NULL, &dwType, reinterpret_cast<LPBYTE>(&buf), &dwBufSize );
你也可以使用UnicodeString
作为缓冲区接收来自RegQueryValueExW()
的字符串数据,eg:
LONG result;
UnicodeString buf;
buf.SetLength(...);
DWORD dwBufSize = ByteLength(buf);
UnicodeString d = L"Nazwa";
DWORD dwType = REG_SZ;
result = ::RegQueryValueExW( hkSoftware, d.c_str(), NULL, &dwType, reinterpret_cast<LPBYTE>(buf.c_str()), &dwBufSize );
if ( result == 0 ) {
buf.SetLength(dwBufSize/sizeof(WideChar));
...
}
也就是说,您应该考虑使用 C++Builder 的 TRegistry
class instead of using the Win32 Registry API directly. TRegistry
has many methods for reading different kinds of data, including ReadString()
作为 String
数据,例如:
#include <Registry.hpp>
TRegistry *Reg = new TRegistry;
String buf;
Reg->RootKey = ...;
if (Reg->OpenKeyReadOnly(_D("...")))
{
buf = Reg->ReadString(_D("Nazwa"));
Reg->CloseKey();
}
delete Reg;
在这种情况下,是否可以不将注册表中的值读取到字符数组而是直接读取到 AnsiString?
LONG result;
wchar_t buf[255] = {0};
DWORD dwBufSize = sizeof(buf);
String d = "Nazwa";
DWORD dwType = REG_SZ;
result = ::RegQueryValueExW( hkSoftware, (LPCWSTR)(d.c_str()), NULL, &dwType, (LPBYTE)&buf, &dwBufSize );
首先,您的代码示例未使用 AnsiString
。在 C++Builder 2009 及更高版本中,String
是 UnicodeString
的别名。
是的,您可以将 UnicodeString
与 RegQueryValueExW()
一起使用,而无需使用类型转换。 UnicodeString::c_str()
returns 一个 WideChar*
,而 WideChar
是 Windows 上 wchar_t
的别名,所以 WideChar*
(又名 wchar_t *
) 可隐式转换为 LPCWSTR
(又名 const wchar_t *
),例如:
LONG result;
wchar_t buf[255] = {0};
DWORD dwBufSize = sizeof(buf);
UnicodeString d = L"Nazwa";
DWORD dwType = REG_SZ;
result = ::RegQueryValueExW( hkSoftware, d.c_str(), NULL, &dwType, reinterpret_cast<LPBYTE>(&buf), &dwBufSize );
你也可以使用UnicodeString
作为缓冲区接收来自RegQueryValueExW()
的字符串数据,eg:
LONG result;
UnicodeString buf;
buf.SetLength(...);
DWORD dwBufSize = ByteLength(buf);
UnicodeString d = L"Nazwa";
DWORD dwType = REG_SZ;
result = ::RegQueryValueExW( hkSoftware, d.c_str(), NULL, &dwType, reinterpret_cast<LPBYTE>(buf.c_str()), &dwBufSize );
if ( result == 0 ) {
buf.SetLength(dwBufSize/sizeof(WideChar));
...
}
也就是说,您应该考虑使用 C++Builder 的 TRegistry
class instead of using the Win32 Registry API directly. TRegistry
has many methods for reading different kinds of data, including ReadString()
作为 String
数据,例如:
#include <Registry.hpp>
TRegistry *Reg = new TRegistry;
String buf;
Reg->RootKey = ...;
if (Reg->OpenKeyReadOnly(_D("...")))
{
buf = Reg->ReadString(_D("Nazwa"));
Reg->CloseKey();
}
delete Reg;