WIndows API 中的“L”和“LPCWSTR”

2023-12-31

我发现

NetUserChangePassword(0, 0, L"ab", L"cd");

将用户密码从 ab 更改为 cd。然而,

NetUserChangePassword(0, 0, (LPCWSTR) "ab", (LPCWSTR) "cd");

不起作用。返回值表示密码无效。

我需要通过const char*作为该函数调用的最后两个参数。我怎样才能做到这一点?例如,

NetUserChangePassword(0, 0, (LPCWSTR) vs[0].c_str(), (LPCWSTR) vs[1].c_str());

Where vs is std::vector<std::string>.


这是两个完全不同的L's.第一个是C++语言语法的一部分。字符串文字前缀为L它变成了wide字符串字面量;而不是数组char,你会得到一个数组wchar_t.

The L in LPCWSTR但没有描述字符的宽度。相反,它描述了pointer。或者,至少,它used to. The L类型名称的缩写是 16 位 Windows 的遗留物,当时有两种指针。有near指针,地址位于当前 64 KB 段内的某个位置,并且有far, or long指针,可以指向当前段之外。操作系统要求调用者向其 API 提供后者,因此所有指针类型名称都使用LP。如今,只有一种类型的指针: Microsoft 保留相同的类型名称,以便旧代码可以继续编译。

的部分LPCWSTR指定宽字符的是W。但仅仅是类型转换char字符串文字为LPCWSTR不足以将这些字符转换为宽字符。相反,发生的情况是类型转换告诉编译器您编写的内容真的是指向宽字符串的指针,即使它实际上不是。编译器信任你。除非您确实比编译器更了解真正的类型,否则不要进行类型转换。

If you really需要通过一个const char*,那么你不需要类型转换任何东西,也不需要任何L字首。普通的旧字符串文字就足够了。 (如果您确实想转换为 Windows 类型,请使用LPCSTR — no W.) 但看起来你真正需要传递的是const wchar_t*。正如我们上面了解到的,您可以通过L字符串文字上的前缀。

在真实的程序中,您可能没有字符串文字。用户将提供密码,或者您将从其他外部源读取密码。理想情况下,您应该将该密码存储在std::wstring,就像std::string但对于wchar_t代替char. The c_str()该类型的方法返回一个const wchar_t*。如果你没有wstring,一个普通数组wchar_t可能就足够了。

但是如果您将密码存储在std::string,那么您需要以其他方式将其转换为宽字符。要进行转换,您需要知道什么代码页 the std::string字符使用。 “当前 ANSI 代码页”通常是一个安全的选择;它由常数表示CP_ACP。调用时您将使用它MultiByteToWideString http://msdn.microsoft.com/en-us/library/dd319072.aspx让操作系统将密码的代码页转换为 Unicode。

int required_size = MultiByteToWideChar(CP_ACP, 0, vs[0].c_str(), vs[0].size(), NULL, 0);
if (required_size == 0)
  ERROR;
// We'll be storing the Unicode password in this vector. Reserve at
// least enough space for all the characters plus a null character
// at the end.
std::vector<wchar_t> wv(required_size);
int result = MultiByteToWideChar(CP_ACP, 0, vs[0].c_str(), vs[0].size(), &wv[0], required_size);
if (result != required_size - 1)
  ERROR;

现在,当你需要一个wchar_t*,只需使用指向该向量的第一个元素的指针:&wv[0]。如果您需要它wstring,您可以通过几种方式从向量构造它:

// The vector is null-terminated, so use "const wchar_t*" constructor
std::wstring ws1 = &wv[0];
// Use iterator constructor. The vector is null-terminated, so omit
// the final character from the iterator range.
std::wstring ws2(wv.begin(), wv.end() - 1);
// Use pointer/length constructor.
std::wstring ws3(&wv[0], wv.size() - 1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WIndows API 中的“L”和“LPCWSTR” 的相关文章

随机推荐

  • 如何在训练期间每个时期结束时调用测试集?我正在使用张量流

    我正在使用 Tensorflow Keras 开发一个 CNN 模型 其中我将数据集分为训练集 验证集和测试集 我需要在每个时期结束时调用测试集以及训练集和验证集来评估模型性能 下面是我跟踪训练集和验证集的代码 result dic epo
  • 如何注入特定的缓存池?

    在我的 Symfony 5 应用程序中 我想针对不同的任务以及不同的环境使用不同的缓存 例如我的配置如下所示 framework cache pools cache auth adapter cache adapter redis prov
  • 将 nginx.conf 添加到 Kubernetes 集群

    我怎样才能通过nginx conf配置文件到 Kubernetes 集群内运行的 nginx 实例 您可以创建一个 ConfigMap 对象 然后将值作为文件安装在您需要的位置 apiVersion v1 kind ConfigMap me
  • 说明:register_shutdown_function [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 什么是register shutdo
  • 我已经被 async/await 宠坏了!现在正在努力解决明确的任务延续问题

    编辑 接受后 它可能不会立即显而易见 但 Servy 的答案是正确的 不需要自定义实现Unwrap在 monodroid 下 在我的评论中我说它不存在 但它确实存在 End edit 我正在编写一堆使用我们的 RESTful Web 服务的
  • Pytesseract - 使用用户模式

    我正在尝试将 tesseract 的用户模式与 pytesseract 一起使用 但似乎无法使该命令正常工作 这看起来应该相当简单 但文档很少 我使用的是 tesseract 3 05 01 这样做是行不通的 pytesseract ima
  • 在 Vim 中更改大小写

    Vim 中是否有命令可以更改所选文本的大小写 Visual select the text http vimdoc sourceforge net htmldoc visual html visual use then U for uppe
  • Python程序遍历目录并读取文件信息

    我刚刚开始使用 Python 但已经发现它比 Bash shell 脚本更加高效 我正在尝试编写一个 Python 脚本 该脚本将遍历从我启动脚本的目录分支的每个目录 并且对于它遇到的每个文件 加载此类的实例 class FileInfo
  • 我在颤振中遇到空安全问题

    我在 Flutter 中遇到空安全问题 我想将数据放入其中水平数据表 https pub dev packages horizontal data table在 Flutter 中 我用StreamBuilder但是当我在小部件内调用它时
  • Boost.Python.ArgumentError:python str 未转换为 std::string

    我收到一个错误 我无法理解尝试通过 Boost Python 包装一个相当简单的 C 类的意义 一 班级 include
  • 使用指令以驼峰命名法设置元素的属性值

    我正在尝试从这样的指令向 angularJs 元素添加属性 element attr startOffset val 但是当我检查该元素时 添加的属性是 startoffset 其中 o 不是大写字母 有什么方法可以向元素添加属性并保持单词
  • Django ORM原始删除查询不删除记录

    我在用raw sql为了方便我的查询以保持数据库最小化 我正在删除额外的记录 通过这个查询 d is from a loop and has values res MyModel objects raw DELETE FROM mydb m
  • JQuery Ajax 投票

    我正在用这个JQuery Ajax 投票系统指南 http ad1987 blogspot com 2009 02 reddit style voting with php mysql and html作为一个粗略的参考 但我对此的安全性有
  • 如何为 Risc-V(汇编语言)编写旋转操作 我们有像 8086 中那样的命令吗?

    我以前使用过8086的汇编语言 8086中的旋转操作只是一个命令 但我在 Risc V 汇编语言中找不到旋转操作的特定关键字 看起来扩展 B 最终应该定义这样的指令 在那之前你必须使用左移和右移来组合它 这是 MIPS32R2 rotrv
  • 如何从资源中播放WAV音频文件?

    如何从我的项目资源中播放 WAV 音频文件 我的项目是 C 中的 Windows 窗体应用程序 Because mySoundFile is a Stream 你可以利用SoundPlayer的重载构造函数 它接受Stream object
  • 什么是 RWS Monad 以及何时使用它

    我在 mtl 库中查找某些内容时遇到了 RWS Monad 及其 MonadTransformer 那里没有真正的文档 我想知道这是什么以及它在哪里使用 我发现 RWS 是 Reader Writer State 的缩写 它是这三个 mon
  • SELECT ... *FOR UPDATE* 的目的是什么?

    我很困惑你为什么要指定FOR UPDATE 为什么数据库关心你要如何处理来自SELECT 编辑 抱歉 我问的问题很糟糕 我知道文档说它将事情变成 锁定读取 我想知道的是 在哪些情况下 可观察的行为在指定之间会有所不同 FOR UPDATE并
  • 如何在Java中格式化时间间隔?

    我创建 J2SE 应用程序 该应用程序需要将两次以毫秒为单位的时间格式化为表示这两次时间之间间隔的字符串 long time1 1334331041677L Fri Apr 13 17 30 41 CEST 2012 long time2
  • 异步函数调用C++0x

    我正在使用以下代码测试 std async 函数http www justsoftwaresolutions co uk threading multithreading in c 0x part 8 futures and promise
  • WIndows API 中的“L”和“LPCWSTR”

    我发现 NetUserChangePassword 0 0 L ab L cd 将用户密码从 ab 更改为 cd 然而 NetUserChangePassword 0 0 LPCWSTR ab LPCWSTR cd 不起作用 返回值表示密码