【问题标题】:Adding new user gives error "a value of type "const wchar_t" cannot be assigned to entity of type "LPWSTR""添加新用户会给出错误“无法将“const wchar_t”类型的值分配给“LPWSTR”类型的实体”
【发布时间】:2021-08-21 18:04:51
【问题描述】:

当我尝试在 C++ 中创建用户帐户时,出现错误

“const wchar_t”类型的值不能分配给“LPWSTR”类型的实体

错误出现两次,usri1_nameusri1_password 上都带有等号。使用 Visual Studio 2019 编译。有什么想法吗?

#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "netapi32.lib") //heard this is dynamic linking ?

#include <windows.h>
#include <lm.h>

int main()
{
    USER_INFO_1 ui;
    DWORD dwLevel = 1;
    DWORD dwError = 0;
    //NET_API_STATUS nStatus;

    ui.usri1_name = L"istech";
    ui.usri1_password = L"p@ssword";
    ui.usri1_priv = USER_PRIV_USER;
    ui.usri1_home_dir = NULL;
    ui.usri1_comment = NULL;
    ui.usri1_flags = UF_PASSWD_CANT_CHANGE;
    ui.usri1_script_path = NULL;

    NetUserAdd(NULL, dwLevel, (LPBYTE)&ui, &dwError);

}

【问题讨论】:

  • 请复制并粘贴错误信息。它包含一个代码 (Cxxxx),您可以使用它在此处查找解释或查找类似问题。作为这里的新用户,也请带上tour并阅读How to Ask
  • 使用 const_cast。 Win32界面设计的不好。
  • 如果您想构建 unicode,请改用正确的项目设置,并且应该在标题中为您处理定义。

标签: c++ winapi


【解决方案1】:

usri_nameusri_password 字段是指向 non-const Unicode 缓冲区的指针,但您正在尝试为它们分配字符串文字,它们是 const 数据.

所以,你可以:

  • const_cast 去掉了字面量的 const-ness(对此要格外小心!):
ui.usri1_name = const_cast<wchar_t*>(L"istech");
ui.usri1_password = const_cast<wchar_t*>(L"p@ssword");
  • 将文字内容复制到本地 wchar_t[] 数组中:
wchar_t name[] = L"istech";
wchar_t pass[] = L"p@ssword";

ui.usri1_name = name;
ui.usri1_password = pass;

【讨论】:

  • 谢谢,成功了!!这几天一直在考虑这个问题。
  • 您不能安全地将 const_cast'ed 指针传递给需要非常量的 API:它可能会尝试修改您的字符串(例如,使用 strtok 解析它,或更改大小写)。事实上,这个特定的功能没有做到这一点纯粹是运气。
  • @VladFeinstein 一般来说,是的。您必须格外小心地使用const_cast。但是,许多较旧的 C API 根本就不是 const 正确的,即使是只读访问也会使用指向非 const 的指针。所以很多时候,你可以摆脱这个。但你真的必须根据具体情况进行评估。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
相关资源
最近更新 更多