C ++ _Tchar单位szTestString []如何分配字符串值

问题描述

请帮助我如何分配值! 我不知道如何从String转换为TCHAR以写入reg_sz注册

string par = "1234.32.23";
_TCHAR szTestString[] = _T(pra);

完整代码

string par = "1234.32.23";   
HKEY ProxyServerKey;
RegCreateKeyExW(HKEY_CURRENT_USER,L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,&ProxyServerKey,NULL);
_TCHAR szTestString[] = _T(par);
RegSetValueExW(ProxyServerKey,L"ProxyServer",REG_SZ,(BYTE*)szTestString,sizeof(szTestString));
RegCloseKey(ProxyServerKey);
SendNotifyMessageW(HWND_broADCAST,WM_SETTINGCHANGE,0);

解决方法

您不能在运行时使用_T()宏来转换数据。它仅在编译时适用于char / string文字。

最好的解决方案是仅使用std::wstring。您可以将其数据直接传递到RegSetValueExW(),根本不需要将其复制到_TCHAR[]缓冲区中,例如:

wstring par = L"1234.32.23";   

HKEY ProxyServerKey;
if (RegCreateKeyExW(HKEY_CURRENT_USER,L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,&ProxyServerKey,NULL) == ERROR_SUCCESS)
{
    RegSetValueExW(ProxyServerKey,L"ProxyServer",REG_SZ,(const BYTE*)par.c_str(),(par.size()+1) * sizeof(wchar_t));
    RegCloseKey(ProxyServerKey);
    SendNotifyMessageW(HWND_BROADCAST,WM_SETTINGCHANGE,0);
}

否则,如果出于任何原因需要继续使用std::string,但又想使用RegSetValueExW(),则必须在以下位置将char数据转换为wchar_t使用MultiByteToWideChar()或同等功能的运行时,例如:

string par = "1234.32.23";   

wstring wpar;
int len = MultiByteToWideChar(CP_ACP,par.c_str(),par.size(),0);
wpar.resize(len);
MultiByteToWideChar(CP_ACP,&wpar[0],len);

HKEY ProxyServerKey;
if (RegCreateKeyExW(HKEY_CURRENT_USER,(const BYTE*)wpar.c_str(),(wpar.size()+1) * sizeof(wchar_t));
    RegCloseKey(ProxyServerKey);
    SendNotifyMessageW(HWND_BROADCAST,0);
}

否则,只需使用RegSetValueExA(),并让它在内部为您从char转换为wchar_t,例如:

string par = "1234.32.23";   

HKEY ProxyServerKey;
if (RegCreateKeyExA(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",NULL) == ERROR_SUCCESS)
{
    RegSetValueExA(ProxyServerKey,"ProxyServer",par.size()+1);
    RegCloseKey(ProxyServerKey);
    SendNotifyMessageW(HWND_BROADCAST,0);
}