【问题标题】:C++ _Tchar units szTestString[] How to assign a string valueC++ _Tchar 单位 szTestString[] 如何分配字符串值
【发布时间】:2020-12-01 12:31:22
【问题描述】:

请帮助我如何分配一个值! 我不知道如何将 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", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &ProxyServerKey, NULL);
_TCHAR szTestString[] = _T(par);
RegSetValueExW(ProxyServerKey, L"ProxyServer", 0, REG_SZ, (BYTE*)szTestString, sizeof(szTestString));
RegCloseKey(ProxyServerKey);
SendNotifyMessageW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);

【问题讨论】:

  • 您真的需要_TCHAR[](即char[])吗?我想你想调用的函数只需要一个const char*,然后你可以使用par.c_str()。你能显示更多的代码吗?或命名您要调用的函数。您可以将strcpy 字符串放入数组中,但可能有更简单的方法。
  • @churill 我添加了完整的代码
  • 这能回答你的问题吗? std::string to char*
  • TCHARW 版本的函数与std::string 混合使用表明对其中一个或另一个实际作用的误解。 (看起来_T 在不了解它的作用的情况下被使用了。)我强烈建议回去学习 Windows 如何处理字符串,然后在与 API 交互时无条件地使用宽字符串。
  • 您可以只使用该 API 的A 版本:docs.microsoft.com/en-us/windows/win32/api/winreg/…

标签: c++ string tchar


【解决方案1】:

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

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

wstring par = L"1234.32.23";   

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

否则,如果您出于某种原因需要继续使用std::string,但又想使用RegSetValueExW(),则必须在运行时使用MultiByteToWideChar() 或等效项将char 数据转换为wchar_t,例如:

string par = "1234.32.23";   

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

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

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

string par = "1234.32.23";   

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

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    相关资源
    最近更新 更多