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

C++ 在C+中读取和写入Windows注册表+;(如何将字符串转换为wchar(?),c++,winapi,C++,Winapi,这是我任务的一部分。我知道如何打开/读取注册表项和创建值,但我有几个问题。我的代码: 这是我将新字符串值写入注册表的方式: void lCreateKeyOne(HKEY hKey, LPCWSTR lSubKey) { WCHAR wcValue[] = TEXT"testvalue"; LONG lNewValue = RegSetValueEx (hKey, L"MytoolsTestKey",

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

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

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();
}
static const char alphanum[]=
"0123456789"
“ABCDEFGHIJKLMNOPQRSTUVWXYZ”
“abcdefghijklmnopqrstuvwxyz”;
int stringLength=sizeof(alphanum)-1;
char genRandom()
{
返回alphanum[rand()%stringLength];
}
srand(时间(0));
字符串Str;
for(无符号整数i=0;i<20;++i)
{
Str+=genRandom();
}
  • 如何将其写入注册表项
  • 如何将字符串Str转换为WCHAR wcValue[]
  • 我试着用char代替wchar,它写汉字
  • static wchar\t const*const alphanum{
    L“0123456789”
    “ABCDEFGHIJKLMNOPQRSTUVWXYZ”
    “abcdefghijklmnopqrstuvwxyz”};
    constexpr auto stringLength{wcslen(alphanum)};
    wchar_t genRandom()
    {
    返回alphanum[std::rand()%stringLength];
    }
    // ...
    std::srand(静态_cast(std::time(nullptr));
    std::wstring-Str;
    对于(std::size_t i{};i<20;++i){
    Str+=genRandom();
    }
    
    那么不使用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();
    }
    
    static wchar\t const*const alphanum{
    L“0123456789”
    “ABCDEFGHIJKLMNOPQRSTUVWXYZ”
    “abcdefghijklmnopqrstuvwxyz”};
    constexpr auto stringLength{wcslen(alphanum)};
    wchar_t genRandom()
    {
    返回alphanum[std::rand()%stringLength];
    }
    // ...
    std::srand(静态_cast(std::time(nullptr));
    wchar_t Str[20+1]={0};
    对于(int i=0;i<20;i++)
    {
    Str[i]=genRandom();
    }
    
    我试着用char代替wchar,它写汉字


    因为您的方法
    RegSetValueEx
    引用的是作为宽字符格式接收的
    RegSetValueExW
    sizeof(char)=1
    sizeof(wchar\u t)=2
    ,两个
    char
    字符的值被读取为
    wchar\u t
    字符(如您在汉字中看到的)。如果您想尝试使用
    char

    1,可以特别参考
    RegSetValueExA
    )如果您想使用
    char
    s而不是
    WCHAR
    s,为什么不能使用?还是不在项目中定义
    UNICODE
    宏?2) 这不是。C没有
    字符串
    。为什么要标记C?对于
    Str
    ,使用
    std::wstring
    而不是
    std::string
    。我认为这应该是一个直接的替代品。与其按你在问题中提出的那样做,不如在Windows中永远不要使用8位文本来回避这个问题
    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();
    }