注册表 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 及更高版本中,StringUnicodeString 的别名。

是的,您可以将 UnicodeStringRegQueryValueExW() 一起使用,而无需使用类型转换。 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;