问题描述
请帮助我如何分配值! 我不知道如何从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);
}