在C ++中读写Windows注册表(如何将字符串转换为wchar(?))

时间:2019-02-06 13:46:42

标签: c++ winapi

这是我任务的一部分。我知道如何打开/读取注册表项并创建值,但是我有几个问题。我的代码:

这是我将新的字符串值写入注册表的方式:

void lCreateKeyOne(HKEY hKey, LPCWSTR lSubKey)
{
WCHAR wcValue[] = TEXT"testvalue";
LONG lNewValue = RegSetValueEx (hKey, 
                                L"MytoolsTestKey", 
                                NULL, 
                                REG_SZ,
                                (LPBYTE)wcValue,                    
                                sizeof(wcValue));
}

它有效,但是我想生成随机字符串并将其写入注册表项。 这就是我生成随机字符串的方式:

static const char alphanum[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";

int stringLength = sizeof(alphanum) - 1;

char genRandom()
{
return alphanum[rand() % stringLength];
}
srand(time(0));
string Str;
for (unsigned int i = 0; i < 20; ++i)
{
   Str += genRandom();
}
  1. 如何将其写为注册表项?
  2. 如何将字符串Str转换为WCHAR wcValue []?
  3. 我试图用char代替wchar,并且它写汉字 https://docs.microsoft.com/en-us/windows/desktop/api/winreg/nf-winreg-regsetvalueexa

2 个答案:

答案 0 :(得分:2)

static wchar_t const * const alphanum{
    L"0123456789"
     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
     "abcdefghijklmnopqrstuvwxyz" };

constexpr auto stringLength{ wcslen(alphanum) };

wchar_t genRandom()
{
    return alphanum[std::rand() % stringLength];
}

// ...
std::srand(static_cast<unsigned>(std::time(nullptr)));

std::wstring Str;
for (std::size_t i{}; i < 20; ++i){
   Str += genRandom();
}

答案 1 :(得分:0)

那不使用string或std :: wstring呢?

static wchar_t const * const alphanum{
    L"0123456789"
     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
     "abcdefghijklmnopqrstuvwxyz" };

constexpr auto stringLength{ wcslen(alphanum) };

wchar_t genRandom()
{
    return alphanum[std::rand() % stringLength];
}

// ...
std::srand(static_cast<unsigned>(std::time(nullptr)));

wchar_t Str[20+1] = { 0 };
for (int i = 0; i < 20; i++)
{
    Str[i] = genRandom();
}
  

我尝试使用char代替wchar并写了汉字

因为您的方法RegSetValueEx是对RegSetValueExW的引用,该引用以宽字符格式接收。 sizeof(char) = 1sizeof(wchar_t) = 2,两个char字符的值被读取为wchar_t字符(如您所看到的中文字符)。如果您想尝试使用RegSetValueExA,则可以专门参考char